|
|
|
|
移动端

1.4 字符串(2)

《程序员面试笔试真题与解析》本书针对当前各大 IT企业面试笔试中特性与侧重点,精心挑选了 3年以来近百家典型 IT企业的面试笔试真题,这些企业涉及业务包括系统软件、搜索引擎、电子商务、手机 APP、安全关键软件等,面试笔试真题非常具有代表性与参考性。本节为大家介绍字符串。

作者:猿媛之家来源:机械工业出版社|2017-12-06 13:34

年前最后一场技术盛宴 | 1月27日与京东、日志易技术大咖畅聊智能化运维发展趋势!


1.4 字符串(2)

【真题 27】下面程序的输出结果是()。

  1. char* getCompany()  
  2. {  
  3. char* pName = "ZTE";  
  4. return pName;  
  5. }  
  6. char* getDepartment()  
  7. {  
  8. char pName[10] = "3G 平台";  
  9. return pName;  
  10. }  
  11. void getSystems(int i, char* pName)  
  12. {  
  13. char* paucSystems[4] = { "SCS", "OSS", "BSP", "OAM" };  
  14. pName = paucSystems[i];  
  15. return;  
  16. }  
  17. int main(int argc, char* argv[])  
  18. {  
  19. char* pName = "DB";  
  20. printf("%s, ", getCompany());  
  21. printf("%s, ", getDepartment());  
  22. getSystems(2, pName);  
  23. printf("%s \n", pName);  
  24. return 0;  

答案:ZTE, 瘙 3蹹 H? DB。

在字符串“ ZTE”与字符串“ DB”之间为乱码。字符串常量存储于字符串常量区,在整个程序运行完毕后才释放,因此对于 getCompany函数而言,pName在 main函数退出前一直有效。而在函数 getDepartment和 getSystems内部定义的数组存储在这个函数对应的栈中,当函数调用结束,函数的栈就会被回收,此时在函数中申请的数组的内容是不确定的。因此这些在函数中定义的数组,在函数结束后生命周期就结束了,它们的值是不确定的。

【真题 28】如下代码是否正确?

  1. void test1()  
  2. {  
  3. char string[10];  
  4. char* str1 = "0123456789";  
  5. strcpy(string, str1);  

答案:程序编译正常,运行错误。

string数组的长度为 10,但是 str1字符串的长度却为 11(字符串以‘ \0’为结束符),所以,在执行函数 strcpy的时候会存在问题。

【真题 29】如下代码是否正确?

  1. void tet2()  
  2. {  
  3. char string[10], str1[10];  
  4. for (inti = 0; i<10; i++)  
  5. {  
  6. str1[i] = 'a';  
  7. }  
  8. strcpy(string, str1);  

答案:strcpy使用错误。

strcpy只有遇到字符串末尾的‘ \0’才会结束,而 str1并没有结尾标志,导致函数 strcpy越界访问,解决方法可以是人为设置 str1[9]='\0'。

【真题 30】如下代码是否正确?

  1. void test3(char* str1)  
  2. {  
  3. char string[10];  
  4. if (strlen(str1) <= 10)  
  5. {  
  6. strcpy(string, str1);  
  7. }  

答案:代码错误。

strlen(str1)的值是不包含结尾符 ‘\0’的,如果 str1刚好为 10个字符 +1个结尾符, string就得不到结尾符了。解决的办法是将 strlen(str1)<=10改为 strlen(str1)<10。

【真题 31】如下代码是否正确?

  1. char* s="AAA";  
  2. printf("%s",s);  
  3. s[0]='B';  
  4. printf("%s",s); 

答案:代码错误。 “AAA”是字符串常量, s是指针,指向这个字符串常量,因此,不能修改这个字符串常量。所以,对字符 s[0]的赋值操作是不合法的。

【真题 32】如下代码是否正确?

  1. int a[60][250][1000], i, j, k;  
  2. for (k = 0; k <= 1000; k++)  
  3. for (j = 0; j <250; j++)  
  4. for (i = 0; i <60; i++)  
  5. a[i][j][k] = 0; 

答案:循环语句内外颠倒。

解决方法是将内外语句调换顺序。因为在 C/C++语言中,数据是按行存储的,所以,顺序颠倒后就是行优先的遍历方法,会有更高的遍历效率。

【真题 33】如下代码是否正确?

  1. int main()  
  2. {  
  3. char a;  
  4. char *str = &a;  
  5. strcpy(str, "hello");  
  6. printf(str);  
  7. return 0;  

答案:代码错误。

没有为 str分配内存空间,将会产生异常。问题出在将一个字符串复制进一个字符变量指针所指地址。虽然可以正确输出结果,但因为对内存进行越界读写而导致程序崩溃。

【真题 34】如下代码是否正确?

  1. char *my_cpy(char* src, int len)  
  2. {  
  3. char dest[1024];  
  4. memcpy(dest, src, len);  
  5. return dest;  

答案:代码错误。

1)数组应该初始化。

2)memcpy没有判断是否越界,所以,调用函数前应该判断数组是否越界。

3)不应该返回

dest,因为这个数组是在函数内部申请的,属于局部变量,所以,函数结束之后就

会消失,指针也会变成“野指针”,所以,会指向非法地址。

喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

网络管理员备考训练——计算机与网络基础知识

本书是根据全国计算机技术与软件专业技术资格(水平)考试《网络管理员考试大纲》所要求的考试范围而编写的试题集。全书共分10个单元,同步...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊