【问题标题】:Initilized string in c giving weird output在c中初始化字符串给出奇怪的输出
【发布时间】:2014-08-26 22:15:50
【问题描述】:

下面显示的代码旨在首先操作字符串 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' 而 is 应该是 'Hello1'??

【问题讨论】:

    标签: string char initialization printf


    【解决方案1】:

    我。没有垃圾,有两个原因。一个是

    char p[10] = "Hello";
    

    等价于

    char p[10] = { 'H', 'e', 'l', 'l', 'o', 0, 0, 0, 0, 0 };
    

    我。 e.它将未列出的成员初始化为零(更准确地说,它将它们初始化为static)。

    其次,即使它们确实未初始化,您也无权期望垃圾值。读取一个未初始化的变量只是未定义的行为,所以那里可能有任何东西。

    二。因为您最终编写了 '1' 过去 NUL 终止符,因为您遍历字符串的方法是错误的。因此,带有putchar 的for 循环将打印所有字符,包括过去的NUL '1',但printf() 将在遇到第一个NUL 时终止。 TL;DR: 而不是

    while *(a++);
    

    你应该写

    while (*a)
        a++;
    

    【讨论】:

      【解决方案2】:

      尝试在一段时间后删除;,不要将a增加两次...

      【讨论】:

      • 不,那是完全错误的。你显然不明白代码应该做什么。如果您删除while 之后的分号,它将用'1's 填充所有字符串。这不是 OP 想要的。
      • @user3477950 您根据什么得出结论 OP 想要什么样的垃圾?
      • 这与垃圾无关。您的答案没有回答第一部分,而是回答了第二部分。 (顺便说一句,至于我的结论:经验。我见过 很多 人提出与此相同的问题,他们总是毫不含糊地无一例外地寻找“垃圾”,因为缺乏初始化,这是一个神话。)
      • @user3477950 如果您删除了while 之后的分号,它将不会用1s 填充字符串。它只会将1 放在奇怪的地方。这可以被视为故意垃圾 - 特别是考虑到 while 之后的行缩进。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-23
      • 1970-01-01
      • 1970-01-01
      • 2011-02-22
      • 2012-07-02
      • 1970-01-01
      相关资源
      最近更新 更多