|
|
|
|
移动端

1.4 字符串(1)

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

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

有奖调研 | 1TB硬盘等你拿 AI+区块链的发展趋势及应用调研


1.4 字符串(1)

【真题 21】给定一个指向字符串的指针 char *p_str,要把字符串中第 4个字符的值改为 ‘a’,正确的做法是()。

A.p_str[3]='a'; B.*(ptr+3)= 'a'; C.p_str[4]= 'a'; D.*(ptr+4)= 'a';答案:A。通常,字符串可以被看成字符数组,因此,本题中第四个字符也等价于数组下标为 3的值(数组下

标从 0开始)。因此,选项 C与选项 D错误。对于选项 A,数组下标通常从 0开始,p_str[3]可以用来访问字符串中第 4个字符。因此,选项 A正确。对于选项 B,正确的写法为 *( p_str +3)= 'a';。因此,选项 B错误。

【真题 22】有如下代码:

  1. #include<iostream> 
  2. using namespace std;  
  3. void swap_int(int a, int b)  
  4. {  
  5. int temp = a;  
  6. a = b;  
  7. b = temp;  
  8. }  
  9. void swap_str(char* a, char* b)  
  10. {  
  11. char* temp = a;  
  12. a = b;  
  13. b = temp;  
  14. }  
  15. int main(void)  
  16. {  
  17. int a = 10;  
  18. int b = 5;  
  19. char* str_a = "hello world";  
  20. char* str_b = "world hello";  
  21. swap_int(a, b);  
  22. swap_str(str_a, str_b);  
  23. printf("%d %d %s %s\n", a, b, str_a, str_b);  
  24. return 0;  

以上程序的打印结果是()。

A.10 5 hello world world hello  B.10 5 world hello hello world

C.5 10 hello world world hello  D.5 10 hello world world hello

答案:A。

值传递是指在函数调用时,编译器会将实际参数复制一份传递到函数中,这样在函数中如果对参数

进行修改,将不会影响到实际参数。本题中,由于两个交换函数都是按值传递进行,当函数执行完后,并没有改变原有变量的值。昀终程序的输出结果还是原变量的值。所以,选项 A正确。需要注意另外一种传递参数的方式,即引用传递。所谓引用传递指的是在调用函数时将实际参数的别名传递到函数中,当在函数中对参数进行修改时,将影响到实际参数的值。

【真题 23】有如下代码:

  1. #include<stdio.h> 
  2. char *myString()  
  3. {  
  4. char buffer[6] = { 0 };  
  5. char *s = "Hello World!";  
  6. for (int i = 0; i <sizeof(buffer)-1; i++)  
  7. {  
  8. buffer[i] = *(s + i);  
  9. }  
  10. return buffer;  
  11. }  
  12. int main(int argc, char **argv)  
  13. {  
  14. printf("%s\n", myString());  
  15. return 0;  

程序的输出结果是()。

A.Hello B.Hello World! C.Well D.以上全部不正确

答案:D。

本题中,函数 char *myString()中没有使用 new或者 malloc分配内存,所以 buffer数组的内存区域在栈区,随着 char *myString()的结束,栈区内存被自动释放,字符数组也就不存在了,所以,此时会产

生野指针,输出结果未知, buffer的内存位于 myString函数的调用栈中,函数调用结束后栈空间已经释

放,打印输出已释放的栈空间,结果未知。所以,选项 D正确。

【真题 24】不能把字符串 "HELLO!"赋给数组 b的语句是()。

A.char b[10]={'H','E','L','L','O','!','\0'}; B.char b[10]; b="HELLO!";

C.char b[10];strcpy(b,"HELLO!"); D.char b[10]="HELLO!";答案:B。字符数组初始化通常有两种方法:第一种是逐个字符赋给数组中每个元素,例如选项 A中所描述的

情况,第二种是用字符串常量对整个数组进行赋值,例如选项 D中所描述的情况。显然,第一种初始化方式比第二种方式繁琐复杂。选项 C采用的是字符串复制函数的方法, strcpy函数的格式为 char *strcpy (char *s1, const char

*s2),它的作用是将字符串 s2所指的字符串复制到 s1所指的字符串中。需要注意的是,参数 s1与参数 s2都是指向字符串的指针, s1可以是字符数组名或字符指针,但不能是字符型常量,s2可以是字符串常量、字符数组或字符指针,而且要保证 s1的长度足够大,以便能容纳下 s2所指的字符串,否则会引起错误。很多读者可能有疑问了,当需要将 s2所指的字符串复制到 s1所指的字符串中时,为什么不能直接使用赋值语句 s1=s2呢?那样不是更为直接吗?其实,s1与 s2都是指向字符数组的指针, s1=s2会把 s2的地址赋值给 s1,这样 s1与 s2就指向同一块内存空间,对字符串 s2的任何修改都会影响字符串 s1的值。

对于选项 B,试图将一个字符串常量赋值给数组 b,而这是不被允许的,因为 b是一个地址常量,只能指向本身的内存空间,不可以指向字符串常量“ Hello!”的首地址。以下这种写法也是不被允许的: char b[10]; b[10]="hello",为什么呢?首先, b[10]表示的是一个字符变量,而“ hello”却是一个字符串常量,一个字符怎么能容纳一个字符串?而且,数组下标是从 0开始计数,长度为 10的字符串数组其下标索引的范围为 [0,9],所以,b[10]是一个非法变量,本身也是不存在的。

所以,本题的答案为 B。引申:不能使用关系运算符“ ==”来比较两个字符串的内容是否相等,只能用 strcmp()函数来处理。

【真题 25】字符串 www.qq.com的所有非空子串(如果两个子串内容相同,那么只算一个)个数是()。

A.1024 B.1018 C.55 D.50答案:D。字符串中任意个连续的字符组成的子序列称为该串的子串,若字符串的长度为 n,则子串的个数就

是[n+(n-1)+.......+2+1]个,但是,本题中,字符串 www.qq.com一共有 10个字符,由于存在着连续重复字符,所以,不能完全套用上面的公式,需要针对重复字符串逐一进行确认。通过分析可以知道,本题中的字符串存在着如下一些可能性:

1)长度

1的非空子串有 10-2-1-1=6个,其中,10表示有 10个字符串, 2表示字符 w有两次重复计数,两个 1分别表示字符 .和字符 q各有一次重复计数,非空子串分别为 w、.、q、c、o、m。

2)长度

2的非空子串有 9-1=8个,其中, 9表示有 9个子串,1表示字符串 ww有 1次重复计数,非空子串分别为 ww、w.、.q、qq、q.、.c、co、om。

3)长度

3的非空子串有 8个,分别为 www、ww.、w.q、.qq、qq.、q.c、.co、com。

4)长度

4的非空子串有 7个,分别为 www.、ww.q、w.q、.qq、qq.、q.c、.co、com。

5)长度

5的非空子串有 6个,分别为 www.q、ww.qq、w.qq.、.qq.c、qq.co、q.com。

6)长度

6的非空子串有 5个,分别为 www.qq、ww.qq.、w.qq.c、.qq.co、qq.com。

7)长度

7的非空子串有 4个,分别为 www.qq.、ww.qq.c、w.qq.co、.qq.com。

8)长度

8的非空子串有 3个,分别为 www.qq.c、ww.qq.co、w.qq.com。

9)长度

9的非空子串有 2个,分别为 www.qq.co、ww.qq.com。

10)长度 10的非空子串有 1个,为 www.qq.com

所有以上这些量加起来 6+8+8+7+6+5+4+3+2+1,其和为 50。所以,选项 D是正确的。

【真题 26】有如下程序片段,以下描述正确的是()。

  1. char *p = "hello";  
  2. *(p + 1) = 'w'; 

A.语法错误,编译通不过 B.链接通不过 C.执行错误 D.都不对答案:C。本题中,p是一个指向字符串常量的指针,本质上来说,它是该字符串的首地址,也就是说, p指

向 h,p+1就指向下一个字符 e了,而字符串常量是不可以更改的,因此,会出现运行时错误。所以,选项 C正确。

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

51CTO读书频道二维码


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

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

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

读 书 +更多

网管员必读——网络组建

本书以一个模拟局域网组建为思路,介绍了与局域网组建各主要方面相关的知识及组建、配置方法。本书所介绍的内容主要包括:局域网组建规划、...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊