为什么使用“%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=]';
我偶然发现了这种我很想了解的行为。
我在程序末尾错误地写了以下内容以打印 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=]';