嗨我有一个简单的代码,打印出charater数组的三个字符,如下所示
void main()
{
char str[]={65,66,67};
printf("%.3s",str);
}
这给出了输出ABC
,但我想知道因为这不是一个字符串意味着它不是空终止然后%s
如何处理它并给出正确的结果?
答案 0 :(得分:10)
由于你传递了字符串的长度,printf不需要0终止符。
7.21.6.1 - 8
如果指定精度,则不超过那么多字节 书面。如果精度未指定或大于尺寸 对于数组,数组应包含一个空字符。
答案 1 :(得分:2)
它起作用是因为你提供了一个精度修饰符。 %.3s字面意思是从输入打印前3个字节。如果您要删除修饰符(“%。3s” - >“%s”),此代码仍然可以构建而不会出现错误,但运行时结果是不可预测的(并且欢迎利用漏洞)。
答案 2 :(得分:0)
澄清上面的答案(通过@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;
)未打印。
答案 3 :(得分:0)
@khachik我认为该片段并不像您期望的那样运行。我无法使用GCC 4.2在OS X上重现结果; 4.7或Clang 3.1