1.4 字符串(2)
《程序员面试笔试真题与解析》本书针对当前各大 IT企业面试笔试中特性与侧重点,精心挑选了 3年以来近百家典型 IT企业的面试笔试真题,这些企业涉及业务包括系统软件、搜索引擎、电子商务、手机 APP、安全关键软件等,面试笔试真题非常具有代表性与参考性。本节为大家介绍字符串。
- 作者:猿媛之家来源:机械工业出版社|2017-12-06 13:34
有奖调研 | 1TB硬盘等你拿 AI+区块链的发展趋势及应用调研
1.4 字符串(2)
【真题 27】下面程序的输出结果是()。
- char* getCompany()
- {
- char* pName = "ZTE";
- return pName;
- }
- char* getDepartment()
- {
- char pName[10] = "3G 平台";
- return pName;
- }
- void getSystems(int i, char* pName)
- {
- char* paucSystems[4] = { "SCS", "OSS", "BSP", "OAM" };
- pName = paucSystems[i];
- return;
- }
- int main(int argc, char* argv[])
- {
- char* pName = "DB";
- printf("%s, ", getCompany());
- printf("%s, ", getDepartment());
- getSystems(2, pName);
- printf("%s \n", pName);
- return 0;
- }
答案:ZTE, 瘙 3蹹 H? DB。
在字符串“ ZTE”与字符串“ DB”之间为乱码。字符串常量存储于字符串常量区,在整个程序运行完毕后才释放,因此对于 getCompany函数而言,pName在 main函数退出前一直有效。而在函数 getDepartment和 getSystems内部定义的数组存储在这个函数对应的栈中,当函数调用结束,函数的栈就会被回收,此时在函数中申请的数组的内容是不确定的。因此这些在函数中定义的数组,在函数结束后生命周期就结束了,它们的值是不确定的。
【真题 28】如下代码是否正确?
- void test1()
- {
- char string[10];
- char* str1 = "0123456789";
- strcpy(string, str1);
- }
答案:程序编译正常,运行错误。
string数组的长度为 10,但是 str1字符串的长度却为 11(字符串以‘ \0’为结束符),所以,在执行函数 strcpy的时候会存在问题。
【真题 29】如下代码是否正确?
- void tet2()
- {
- char string[10], str1[10];
- for (inti = 0; i<10; i++)
- {
- str1[i] = 'a';
- }
- strcpy(string, str1);
- }
答案:strcpy使用错误。
strcpy只有遇到字符串末尾的‘ \0’才会结束,而 str1并没有结尾标志,导致函数 strcpy越界访问,解决方法可以是人为设置 str1[9]='\0'。
【真题 30】如下代码是否正确?
- void test3(char* str1)
- {
- char string[10];
- if (strlen(str1) <= 10)
- {
- strcpy(string, str1);
- }
- }
答案:代码错误。
strlen(str1)的值是不包含结尾符 ‘\0’的,如果 str1刚好为 10个字符 +1个结尾符, string就得不到结尾符了。解决的办法是将 strlen(str1)<=10改为 strlen(str1)<10。
【真题 31】如下代码是否正确?
- char* s="AAA";
- printf("%s",s);
- s[0]='B';
- printf("%s",s);
答案:代码错误。 “AAA”是字符串常量, s是指针,指向这个字符串常量,因此,不能修改这个字符串常量。所以,对字符 s[0]的赋值操作是不合法的。
【真题 32】如下代码是否正确?
- int a[60][250][1000], i, j, k;
- for (k = 0; k <= 1000; k++)
- for (j = 0; j <250; j++)
- for (i = 0; i <60; i++)
- a[i][j][k] = 0;
答案:循环语句内外颠倒。
解决方法是将内外语句调换顺序。因为在 C/C++语言中,数据是按行存储的,所以,顺序颠倒后就是行优先的遍历方法,会有更高的遍历效率。
【真题 33】如下代码是否正确?
- int main()
- {
- char a;
- char *str = &a;
- strcpy(str, "hello");
- printf(str);
- return 0;
- }
答案:代码错误。
没有为 str分配内存空间,将会产生异常。问题出在将一个字符串复制进一个字符变量指针所指地址。虽然可以正确输出结果,但因为对内存进行越界读写而导致程序崩溃。
【真题 34】如下代码是否正确?
- char *my_cpy(char* src, int len)
- {
- char dest[1024];
- memcpy(dest, src, len);
- return dest;
- }
答案:代码错误。
1)数组应该初始化。
2)memcpy没有判断是否越界,所以,调用函数前应该判断数组是否越界。
3)不应该返回
dest,因为这个数组是在函数内部申请的,属于局部变量,所以,函数结束之后就
会消失,指针也会变成“野指针”,所以,会指向非法地址。
喜欢的朋友可以添加我们的微信账号:
51CTO读书频道二维码
51CTO读书频道活动讨论群:365934973
回书目 上一节 下一节 |
- 大家都在看
- 猜你喜欢
- 24H热文
- 一周话题
- 本月最赞
- 3.3.1.1 标准9针串口引脚定义8.2.8 drawRoundRect方法:绘制圆角矩形4.5.1 登录页面login.jsp2.6.1 @Produces注解一、中国制造2025主要内容Python即学即用深入理解Spring Cloud与微服务构建12.2 使用DROP INDEX删除索引
- 3.3.1.1 标准9针串口引脚定义一、中国制造2025主要内容8.2.8 drawRoundRect方法:绘制圆角矩形7.2.3 用ALTER TABLE语句来创建索引2.6.1 @Produces注解深入理解Spring Cloud与微服务构建12.2 使用DROP INDEX删除索引8.2.12 drawArc方法:绘制圆弧
- 3.3.1.1 标准9针串口引脚定义深入理解Spring Cloud与微服务构建8.2.8 drawRoundRect方法:绘制圆角矩形一、中国制造2025主要内容7.2.3 用ALTER TABLE语句来创建索引2.3 三角函数的图像12.2 使用DROP INDEX删除索引2.6.1 @Produces注解
视频课程+更多
-
Shell运维自动化高级实战视频课程[老男孩Linu
讲师:老男孩107285人学习过
-
零基础新版CCNA教学(真实案例结合)视频课程
讲师:吴群35696人学习过
-
C语言从零到实战视频课程
讲师:武永亮44091人学习过
最新专题+更多
- 精选博文
- 论坛热帖
- 下载排行
-
订阅51CTO邮刊
点击这里查看样刊