为什么使用“%s”格式说明符来 printf char 数组在数组中的最后一个 char 之后输出额外的无意义值?

Why does using the "%s" format specifier to printf an array of char output additional nonsense values after the final char in the array?

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

我在程序末尾错误地写了以下内容以打印 char 数组中的元素:

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

当我应该(并最终做到)遍历数组并像这样打印每个元素时:

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

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

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

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

(编辑以替换第一个示例中的 outputText[] --> outputText。)

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

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

您可能缺少 '[=10=]' 字符作为标记字符串结尾的字符数组的元素。

您缺少字符串终止字符 [=11=] 字符串结尾。因此,使您的字符串 [=11=] 终止。喜欢:

outputText[textLength-1] = '[=10=]';