热火朝天准备了两天的华为机试,终于考了。考前很虚,很多东西没看。好在华为的机试不考死记硬背的东西,考的编程的规范、思维。今年的考题只有一道,时间20分钟。所有人都是C/C++,没有java。真正编代码的时间也就五六分钟,题很简单。但我觉的,还是很有水平的题。
题目:将字符串中的每一个字符,变成他的下一个字符。大小写不变,如果是z就改成a。(其他的没说,如果是Z改成A)。比如,输入为abcf,输出应为bcdg。
函数原型给定了:void change_letter(char *pInStr, char *pOutStr)
下面是我的作答,仅供参考:
#include<stdio.h>
void change_letter(char *pInStr, char *pOutStr)
{
if(pInStr == NULL || pOutStr == NULL)
return;
while(*pInStr)
{
if(*pInStr == 'z')
*pOutStr = 'a';
else if(*pInStr == 'Z')
*pOutStr = 'A';
else
*pOutStr = *pInStr + 1;
pInStr++;
pOutStr++;
}
*pOutStr = '\0';
}
void main()
{
char *test = "guozhaoyanguoqi";
char *out = (char *)malloc(strlen(test));
*out = '\0';
//char out[100];
change_letter(test, out);
printf("%s\n", out);
}
这里,有几个值得注意的地方,这些细节也正是考官的加分点或扣分点。
1,函数的开头要判断是否申请了内存:if(pInStr == NULL || pOutStr == NULL),因为他们要求不准自己加头文件。默认的就是#include<stdio.h>,所以没用assert。扯淡的是,考场上由于紧张,我只判断了pInStr,忘了判断输出了!它大爷的
2,while循环里可以写while(*pInStr != '\0'),也可以像我上面写的那样while(*pInStr),本着简单的原则我采用后者。
3,while循环出来之后,输出字符串一定要加字符串结束符'\0'.while循环出来之后,指针pOutStr指向的是最后一个字符的下一个字节,所以这里直接赋值‘\0’就可以了。从程序健壮性考虑一定要赋,但也有意想不到的隐情,请看4
4,主函数里要给out申请内存。有两种方式,一种是char out[100];直接申请100个。如果while循环里不加'\0',将会看到如下错误结果:
如果加上‘\0’的话,一切会正常。但我想工程上不会让这么浪费内存吧,因此采用第二种方式是必须的。
第二种方式,char *out = (char *)malloc(strlen(test));即用多少申请多少。这时,while循环出来之后,从程序结果上来看加不加'\0'都是一样的,但真的么?我将程序修改如下:
#include<stdio.h>
#include<stdlib.h>
void change_letter(char *pInStr, char *pOutStr)
{
if(pInStr == NULL || pOutStr == NULL)
return;
while(*pInStr)
{
if(*pInStr == 'z')
*pOutStr = 'a';
else if(*pInStr == 'Z')
*pOutStr = 'A';
else
*pOutStr = *pInStr + 1;
pInStr++;
pOutStr++;
}
//*pOutStr = '\0';
}
void main()
{
char *test = "guozhaoyanguoqi";
// *out = NULL;
// printf("strlen(test) = %d", strlen(test));
char *out = (char*)malloc(strlen(test));
// *out = '\0';
// char out[100];
change_letter(test, out);
printf("%s\n", out);
printf("strlen(out) = %d\n", strlen(out));
}
运行结果:
虽然字符串的结果是对的,但打印出来strlen(out)=19,而源字符串的长度是15. 这里就出错了,如果此时对out没有察觉,用out作其他处理时会引发致命错误!这些大公司考字符串不是没有意义的。
对了对比明确,我将主程序修改如下:
void main()
{
char *test = "guozhaoyanguoqi";
printf("strlen(test) = %d", strlen(test));
char *out = (char*)malloc(strlen(test));
// *out = '\0';
// char out[100];
change_letter(test, out);
printf("%s\n", out);
printf("strlen(out) = %d\n", strlen(out));
}
仅仅是在申明char *out前加了一句话,竟然编译不通过:
错误信息是:
C:\Documents and Settings\Administrator\桌面\快捷方式\huawei.c(25) : warning C4013: 'strlen' undefined; assuming extern returning int
C:\Documents and Settings\Administrator\桌面\快捷方式\huawei.c(26) : error C2143: syntax error : missing ';' before 'type'
C:\Documents and Settings\Administrator\桌面\快捷方式\huawei.c(29) : error C2065: 'out' : undeclared identifier
C:\Documents and Settings\Administrator\桌面\快捷方式\huawei.c(29) : warning C4047: 'function' : 'char *' differs in levels of indirection from 'int '
C:\Documents and Settings\Administrator\桌面\快捷方式\huawei.c(29) : warning C4024: 'change_letter' : different types for formal and actual parameter 2
Error executing cl.exe.
将主程序改为:
void main()
{
char *test = "guozhaoyanguoqi";
char *out = NULL;
printf("strlen(test) = %d\n", strlen(test));
out = (char*)malloc(strlen(test));
// *out = '\0';
// char out[100];
change_letter(test, out);
printf("%s\n", out);
printf("strlen(out) = %d\n", strlen(out));
}
就能正常编译运行了!乖乖,多亏了写这个博客!
看来c语言里,变量的申明和c++还是有所不同的,c++是即申明即用,但c略微不同,有时还不易察觉。像这里,如果没有printf("strlen(test) = %d\n", strlen(test));这句话,采用char*out = (char*)malloc(。。。)这种方式没有啥问题。但就多了一句printf这句话,这样申明就不中了。看来还是要规规矩矩的来!先申明char
*out = NULL;然后再out=(char*)(。。。)。程序运行结果如下:
仅仅是对输入字符串的值做了改变,输出和输入的两个字符串的长度竟然不一样,这都是while循环里字符串结尾没有加‘\0’惹的祸!如果您不查看strlen,这个祸还有可能发现不了!
将while里的加‘\0’带上,如上的主程序,运行结果一切正常,如下:
引发的三个未解决的疑问:
1,out的申明长度问题,是该out = (char*)malloc(strlen(test));还是该申明strlen(test)+1个长度?我用前者,也没有报错!按理说,应该申明strlen(test)+1更严密!否则的话最后while出来之后的*pOutStr的赋值占用的是非法内存,是未申明的内存。是不是有什么后患???
2,在out = (char*)malloc(strlen(test)+1)申明内存之后,是不是要用*out = '\0';对这块内存进行初始化一下? 我以前没有这个意识,最近看书籍,有的书上讲到这么初始化一下,不写这句也没发现啥问题。作何解释???
3,我连着申明两个字符串内存空间,如
char *test = "guozhaoyanguoqi";
char *out == (char*)malloc(strlen(test)+1);
没有啥问题。当第一个语句后随便加一个语句,再申明out的时候怎么就乱报错???必须采用
char *out = NULL;
out = (char*)malloc(。。。。)
这种方式才能够申明通过。这两种申明方式本质上有什么区别吗?? 这就是传说中的字节对齐
ps:走出考场,我觉的写的程序能得90分最起码,吃饭时想到忘了判断pOutStr为NULL,得85分吧!文章写到一半,发现申明out的长度应该是strlen(pInStr)+1,得分80. 半路杀出个程咬金,无意发现申明字符串时的正确方式,应该是char*out = NULL;然后out = (char*)malloc(。。。),这样才严密!我靠,80分不到了。。。。。
欢迎大牛前来指点后生的三个疑问。
分享到:
相关推荐
内含华为鲲鹏920-4826/Intel-Platinum-9242/Intel-E5-2680V2双路计算服务器的miniFE-264x256x256benckmark测试对比图,含gcc/icc结果。需要积分下载些东西,感谢理解支持!
华为od机试题huawei-od-python-master.zip
内含华为鲲鹏920-4826/Intel-Platinum-9242/Intel-E5-2680V2双路计算服务器的LinpackHPL benchmark对比评测图,含gcc/icc结果。需要积分下载些东西,感谢理解支持!
《2019华为软件精英挑战赛-工程编译指导书-C++-v1.01》 本指导书详细阐述了2019年华为软件精英挑战赛中,针对C++编程语言的工程编译流程,旨在帮助参赛者顺利进行代码编写、编译和提交。以下是关键知识点: 1. **...
《2019华为软件精英挑战赛-工程编译指导书-C++-v2.01》 本指导书详细阐述了2019年华为软件精英挑战赛中,使用C++编程语言进行工程编译的相关流程和注意事项,旨在帮助参赛者顺利进行代码开发和提交。以下是关键知识...
适用已下型号华为交换机: S5700-28X-LI-AC/S5700-28X-LI-DC/S5701-28X-LI-AC/S5700-28X-PWR-LI-AC/S5700-52X-LI-AC/S5700-52X-LI-DC/S5700-28X-LI-24S-AC/ S5700-28X-LI-24S-AC/S5701-28X-LI-24S-AC/S5700-52X-PWR-...
解析华为三----华为公司研发体系流程构成解读.docx解析华为三----华为公司研发体系流程构成解读.docx解析华为三----华为公司研发体系流程构成解读.docx解析华为三----华为公司研发体系流程构成解读.docx解析华为三--...
华为od机试题-真题(包含答案) 华为od机试题-真题(包含答案) 华为od机试题-真题(包含答案) 华为od机试题-真题(包含答案) 华为od机试题-真题(包含答案) 华为od机试题-真题(包含答案) 华为od机试题-真题...
华为S5700-28-LI-AC是一款企业级的接入层交换机,广泛应用于中小型企业或大型网络的边缘。这款设备以其高性能、高可靠性和丰富的功能特性而受到青睐。本文将深入探讨该型号交换机的固件及其系统。 固件是设备的核心...
华为 HoloSens SDC M2141-10-EL(2.8-12mm) 彩页 华为 HoloSens SDC M2141-10-EL(2.8-12mm) 是一款高性能的机器视觉摄像头,支持1 TOPS算力,具备多种智能分析功能,如人脸检测、人体检测、车辆检测、交通数据统计等...
华为S5700-24TP-SI-AC是一款广泛应用的企业级三层交换机,主要设计用于构建高效、稳定的企业网络。这款交换机支持多种高级功能,如虚拟化、QoS(服务质量)、IPv4/IPv6双栈以及安全策略等。在本资源中,我们关注的是...
华为三层交换机S5700-28C-EI配置文档知识点总结 华为三层交换机S5700-28C-EI是一个功能强大且灵活的网络交换机,支持多种网络协议和应用场景。以下是根据给定的文件信息,总结出的相关知识点: 一、设备基本配置 ...
华为交换机固件S5700S-52P-LI-AC的固件 不保证24口能用。交换机中扣出来的。
《2019华为软件精英挑战赛-工程编译指导书-Python-v1.01》是一份针对参赛者在华为软件精英挑战赛中的Python编程指南。这份文档旨在帮助参赛者理解如何正确编译和打包他们的Python源码,以便于在指定的Linux环境下...
适用已下型号华为交换机: S5700-28P-LI-AC/S5700-28P-PWR-LI-AC/S5700-52P-LI-AC/S5700-52P-PWR-LI-AC/S5700-28P-LI-DC/S5700-52P-LI-DC
华为OptiXstar K662c-20V500R021C00SPC102 电信整合版固件,解决LAN互通问题~!
Mode LastWriteTime Length Name ---- ------------- ------ ---- da---- 2020/3/31 13:39 1-1RIPv1&v2 da---- 2020/3/31 13:39 2-1Single-Area OSPF da---- 2020/3/31 13:39 2-2Multi-Area OSPF ...
【2021华为软件精英挑战赛-工程编译指导书-C&C++-v1.01】是针对参赛者的一份详细指南,旨在帮助他们理解如何在比赛中使用C++进行开发、编译、运行和打包提交代码。以下是这份指南的关键知识点: 1. **整体说明**:...
华为新版测试软件GENEX-Probe-V500R002-setup.exe,新版本带地图, 通信行业 华为测试工具,免加密狗, 版本 GENEX-Probe-V500R002-setup-5.2.T7, License 自己申请
华为企业路由器AR1200-S产品介绍与评测.pdf华为企业路由器AR1200-S产品介绍与评测.pdf华为企业路由器AR1200-S产品介绍与评测.pdf华为企业路由器AR1200-S产品介绍与评测.pdf华为企业路由器AR1200-S产品介绍与评测.pdf...