热火朝天准备了两天的华为机试,终于考了。考前很虚,很多东西没看。好在华为的机试不考死记硬背的东西,考的编程的规范、思维。今年的考题只有一道,时间20分钟。所有人都是C/C++,没有java。真正编代码的时间也就五六分钟,题很简单。但我觉的,还是很有水平的题。
题目:将字符串中的每一个字符,变成他的下一个字符。大小写不变,如果是z就改成a。(其他的没说,如果是Z改成A)。比如,输入为abcf,输出应为bcdg。
函数原型给定了:void change_letter(char *pInStr, char *pOutStr)
下面是我的作答,仅供参考:
这里,有几个值得注意的地方,这些细节也正是考官的加分点或扣分点。
2,while循环里可以写while(*pInStr != ‘ ’),也可以像我上面写的那样while(*pInStr),本着简单的原则我采用后者。
3,while循环出来之后,输出字符串一定要加字符串结束符’ ’.while循环出来之后,指针pOutStr指向的是最后一个字符的下一个字节,所以这里直接赋值‘ ’就可以了。从程序健壮性考虑一定要赋,但也有意想不到的隐情,请看4
4,主函数里要给out申请内存。有两种方式,一种是char out[100];直接申请100个。如果while循环里不加’ ’,将会看到如下错误结果:
如果加上‘ ’的话,一切会正常。但我想工程上不会让这么浪费内存吧,因此采用第二种方式是必须的。
第二种方式,char *out = (char *)malloc(strlen(test));即用多少申请多少。这时,while循环出来之后,从程序结果上来看加不加’ ’都是一样的,但真的么将程序修改如下:
对了对比明确,我将主程序修改如下:
仅仅是在申明char *out前加了一句话,竟然编译不通过:
错误信息是:
将主程序改为:
将while里的加‘ ’带上,如上的主程序,运行结果一切正常,如下:
引发的三个未解决的疑问:
1,out的申明长度问题,是该out = (char*)malloc(strlen(test));还是该申明strlen(test)+1个长度用前者,也没有 错!按理说,应该申明strlen(test)+1更严密!否则的话最后while出来之后的*pOutStr的赋值占用的是非法内存,是未申明的内存。是不是有什么后患/span>
2,在out = (char*)malloc(strlen(test)+1)申明内存之后,是不是要用*out = ‘ ’;对这块内存进行初始化一下/strong> 我以前没有这个意识,最近看书籍,有的书上讲到这么初始化一下,不写这句也没发现啥问题。作何解释/span>
3,我连着申明两个字符串内存空间,如
char *test = “guozhaoyanguoqi”;
char *out = = (char*)malloc(strlen(test)+1);
没有啥问题。当第一个语句后随便加一个语句,再申明out的时候怎么就乱 错须采用
char *out = NULL;
out = (char*)malloc(。。。。)
欢迎大牛前来指点后生的三个疑问。
文章知识点与官方知识档案匹配,可进一步学习相关知识C技能树首页概览113671 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!