1
我C
代码是这样的:为什么scanf无法为输入参数赋值?
#include <stdio.h>
#include <string.h>
int main(void) {
char s[10];
int i = 0, j = 0, k = 0;
memset(s, 0xff, sizeof(s));
scanf("%9s%d%d%d", s, &i, &j, &k);
printf("%s,%d,%d,%d\n", s, i, j, k);
}
为了避免缓冲区溢出,我在scanf
使用%9s
。但我发现,如果输入的字符串长度小于10
,结果正如我预料:
# ./test
short 1 2 3
short,1,2,3
虽然长度较长或等于10
,i
,j
和k
不能获得输入:
# ./test
verylongstr 1 2 3
verylongs,0,0,0
如何理解scanf
的行为?
如果你分配10个字节并把12个字节存在那里,你得到的任何东西都是纯粹的巧合。你可能会遇到崩溃,或者错误的答案,或者正确的答案,或者恶魔飞出你的鼻子。一旦违反规则,编译器没有义务做任何明智的事情。 –
@LeeDanielCrocker这就是使用'%9s'的全部观点,他在他的问题中解释了这一点。 – Barmar