嗨,我有一个简单的代码,它打印一个字符数组的三个字符,如下所示
void main()
{
char str[]={65,66,67};
printf("%.3s",str);
}
这给出了输出ABC
,但我想知道因为这不是字符串意味着它不是空终止的,那么如何%s
处理它并给出正确的结果?
由于您传递了字符串的长度,因此 printf 不需要 0 终止符。
7.21.6.1 - 8
如果指定了精度,则写入的字节数不会超过。如果未指定精度或大于数组的大小,则数组应包含空字符。
它之所以有效,是因为您提供了一个精度修饰符。%.3s 字面意思是从输入打印前 3 个字节。如果您要删除修饰符(“%.3s”->“%s”),此代码仍将无错误地构建,但运行时结果是不可预测的(并且欢迎利用)。
为了澄清上面的答案(@cnicutar 和 dans3itz):以下代码打印“ABCDE”,即printf
扫描数组到第一个空字符(0 字节):
#include <stdio.h>
int main() {
char str[]={65,66,67};
char c = 68;
int x = 69;
int y = 70;
int z = 0;
int w = 71;
printf("%s", str);
return 0;
}
F
( int w = 71;
) 不打印。
@khachik 我不认为该片段按您预期的那样运行。我无法使用 GCC 4.2 在 OS X 上重现结果;4.7 或 Clang 3.1