首页 > 试题广场 >

下面程序段的运行结果是?

[单选题]
下面程序段的运行结果是
chr a[20] = "xunlei", b[] = "is download";
strcat(a, " ");
strcat(a, b);
cout << a << endl;

  • xunlei is download
  • xunleiis download
  • xunlei
  • 出错
选A 
extern char *strcat(char *dest,char *src);
把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0'。需要注意的是src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。 返回指向dest的指针。
题目中a为20个字符 足以容纳“ ”和b,因此最后输入的为把" "和b追加到a后面的字符串 xunlei is download

发表于 2015-10-17 07:25:45 回复(0)
更多回答
这是GNU的源码,你看下:

/* Append SRC on the end of DEST.  */

char *

strcat (char *dest, const char *src)

{

  strcpy (dest + strlen (dest), src);

  return dest;

}

strcat 的实现调用了 strcpy 函数 ;dest是指针,指针可以加减,理解为内存地址的加减就行了,这里是说地址加上目标指针指向字符串的长度;并且不算'\0';这意味着src的第一个字符将取代这个 '\0';

/* Copy SRC to DEST.  */

char *

strcpy (char *dest, const char *src)

{

  return memcpy (dest, src, strlen (src) + 1);

}

strcpy 的实现又调用了 memcpy 函数,dest 是目标地址,也就是要将 src 内存地址里的东西 copy 到 dest指向的空间里,长度是 src 字符串的长度 +  1;注意加 1 的意图是要copy src 的最后一个隐含字符'\0';这样 copy 之后 dest 就会以 '\0' 结尾啦;

答案肯定是A啦....

注意:c 语言字符串是要以 '\0' 结尾的;要不然就不知道到哪里结束了!
'\0' 其实就是 NULL ,ASCLL 是 0;有兴趣的话去查下数字0的ASCLL是多少,这也是当初学C语言疑惑的地方。



编辑于 2015-10-18 00:25:46 回复(0)
选A,strcat(a,b)将两个char连接并放入a中

发表于 2015-10-18 00:00:47 回复(0)
答案:A
strcat(连接两字符串) 函数定义: char *strcat (char *dest,const char *src)
函数说明:strcat()会将参数src字符串拷贝到参数dest所指的字符串尾,第一个参数dest要有足够的空间来容纳要拷贝的字符串;
返回值: 返回dest字符串参数的起始地址;
方案一:两个参数都是数组

   

  1. #include < string .h>
  2. #include <stdio.h>

  3. int main(void)
  4. {
  5. char dest[30] = "Hello" ;
  6. char src[ ] = "World" ;

  7. strcat(dest, src) ;
  8. printf( "dest:[%s]\n" , dest) ;

  9. return 0;
  10. }

得到的结果是: dest:[HelloWorld]

方案二:两个参数都是指针

     

  1. #include <stdio.h>
  2. #include < string .h>

  3. int main(void)
  4. {
  5. char *dest = NULL ;
  6. char *src = "World" ;

  7. strcat(dest, src) ;
  8. printf( "dest:[%s]" , dest) ;

  9. return 0;
  10. }
  11. ~

得到的结果却是: Segmentation fault (core dumped)竟然是段错误,为什么呢?
很显然 strcat函数在将src的内容拷贝到dest中是没问题的,但是dest没有足够的空间来存储src中的内容;
修改之后的:

     

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include < string .h>

  4. int main(void)
  5. {
  6. char *dest = NULL ;
  7. dest = (char * )malloc(1024) ;
  8. char *src = "World" ;

  9. strcat(dest, src) ;
  10. printf( "dest:[%s]" , dest) ;

  11. return 0;
  12. }
  13. ~

得到的结果为: dest:[World]

方案三:第一个是数组,第二个位指针

     

  1. #include <stdio.h>
  2. #include < string .h>

  3. int main(void)
  4. {
  5. char dest[6] = "Hello";
  6. char *src = "World" ;

  7. strcat(dest, src) ;
  8. printf( "dest:[%s]\n" , dest) ;

  9. return 0;
  10. }
显示结果: dest:[HelloWorld] 为什么会这样呢?不是说要空间足够的时候才可以拷贝成功的么?
很明显,这属于数组越界的问题,在C语言中
c不检查也不提示,所以这里的拷贝用到了 dest[6]后面紧挨着的几个存储单元;
方案四:第一个指针,第二个数组

       

  1. #include <stdio.h>
  2. #include < string .h>

  3. int main(void)
  4. {
  5. char *dest;
  6. char src[ ] = "World" ;

  7. strcat(dest, src) ;
  8. printf( "dest:[%s]\n" , dest) ;

  9. return 0;
  10. }
看到这里,都会知道肯定是dest的空间不足,无法拷贝src中的内容;
所以输出结果是:Segmentation fault (core dumped)
更改之后:

       

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include < string .h>

  4. int main(void)
  5. {
  6. char *dest;
  7. dest = (char * )malloc(1024) ;
  8. char src[ ] = "World" ;

  9. strcat(dest, src) ;
  10. printf( "dest:[%s]\n" , dest) ;

  11. return 0;
  12. }
发表于 2015-10-17 16:47:29 回复(0)
选A。strcat(str1,str2)是把str2连接到str1后面
发表于 2015-10-17 15:52:38 回复(0)