【c语言求助】

分析下面程序的运行结果。
#include "conio.h"
#include "string.h"
#include "stdio.h"
void main()
{
static char a[10]="abcdefghi",b[]="happy";
strcpy(a,b);
puts(a);
printf("%c\n",a[7]);
}
为什么运行结果是这样的?happy后面的呢?

第1个回答  推荐于2016-07-12

首先,

char * strcpy(char * dest, const char * src)

函数是将 src 字符串中包含字符终止符 '\0' 及其之前的所有字符都复制到以 dest 所指的地址开始的空间中。


而在你的代码中,定义了

b[] = "happy";


这种定义法会为该字符串自动添加一个终止符号。也就是说 b 所代表的字符串实际上在内存中是以 "happy\0" 的形式存储的。反斜杠零表示了该字符串的结束,并会占用一个字符的空间。当你用 strcpy 将 b 中的内容拷贝到 a 所指的地址中时,因为会连 b 中的 '\0' 一同拷贝,所以在执行完 strcpy 时,a 的实际值是 "happy\0ghi"。


而编译器在看到 '\0' 字符时就会认为该字符串已经结束,所以 '\0' 之后的所有字符虽然仍在地址空间中存在,但都会被忽略,在打印字符串时不会被输出。因此你的

puts(a);

输出的只有 "happy"。


但又因为 '\0' 后的字符仍然在数组 a 中存在,所以你试图打印出 a[7] 的值时,屏幕上仍会输出 'h'。这个 'h' 是字符数组 a,也就是 "happy\0ghi" 中的倒数第二个字符,你可以自己数一下看看 a[7] 是不是 'h'。

本回答被提问者采纳
第2个回答  2015-06-29
happy的y后面有个\0字符表示字符串结束,copy到a后中间就有了个\0,任何打印输出字符串的函数都只打印到\0。
第3个回答  2020-01-13
相似回答