下面显示的代码旨在首先操作字符串p的内容然后打印其内容。我使用两个while循环和一个printf语句测试了代码。
#include <stdio.h>
#include <string.h>
int main(void) {
char p[10] = "Hello";
char *a = p;
while(*a++)
;
*a++ = '1';
*a++ = '\0';
a = p;
int i;
for(i = 0; i < 10; i++)
putchar(a[i]);
putchar('\n');
for(i = 0; i < 10; i++)
putchar(p[i]);
putchar('\n');
printf("%s\n", p);
return 0;
}
输出:
xxx@ubuntu:~$ gcc -o test test.c
xxx@ubuntu:~$ ./test
Hello1
Hello1
Hello
现在,我有两个问题,首先,在打印这7个字符(包括NULL)后,前两行中的所有垃圾值都显示在哪里。其次,为什么printf语句的输出是'Hello'而应该是'Hello1'??
答案 0 :(得分:1)
予。由于两个原因,没有垃圾。一个是那个
char p[10] = "Hello";
等同于
char p[10] = { 'H', 'e', 'l', 'l', 'o', 0, 0, 0, 0, 0 };
我。即它将未列出的成员初始化为零(更确切地说,它将它们初始化为static
)。
其次,即使它们真的没有初始化,你也没有权利期望垃圾价值。读取未初始化的变量只是未定义的行为,因此可能存在任何内容。
II。因为您最终编写了'1'
过去 NUL终结符,因为您遍历字符串的方法是错误的。因此,遍历每个字符的putchar
的for循环将打印所有字符,包括过去的NUL '1'
,但printf()
将在遇到的第一个NUL处终止。 TL; DR:而不是
while *(a++);
你应该写的
while (*a)
a++;
答案 1 :(得分:0)
请稍等片刻后删除;
,不要再增加a
两次......