为什么使用"%s"格式说明符printf一个char数组输出数组中的最后一个char后的附加无意义值?

时间:2017-05-25 10:05:26

标签: c arrays printf format-specifiers

我偶然发现了我很想理解的这种行为。

我在一个程序的末尾错误地写了下面的代码来打印char数组中的元素:

printf("output: %s",outputText[]);

当我应该(并且最终确实)迭代数组并打印每个元素时:

for(int i = 0; i < textLength; i++){

        printf("%c",outputText[i]);
    }

促使我实施后者的是我得到的输出。尽管初始化数组以将字符限制为outputText[textLength],但确保数组中没有意外的元素,实现前一代码时的输出总是会被其他怪异的元素所占据,如下所示:

spooky character additions

我只是连续三次运行同一个程序,并在我的数组末尾附加了三个随机字符。

(在第一个示例中,编辑以替换outputText[] - &gt; outputText。)

3 个答案:

答案 0 :(得分:5)

%s用于字符串;字符串是以NUL结尾的字符数组(十六进制为0x00,或'\0'为字符),因此printf()将打印,直到找到NUL!

如果您将数组的最后一个元素设置为NUL,printf将在那里完成。

答案 1 :(得分:2)

您可能缺少'\0'字符作为标记字符串结尾的字符数组的元素。

答案 2 :(得分:1)

您缺少字符串终止字符\0字符串的结尾。所以,让你的字符串\0终止。像:

outputText[textLength-1] = '\0';