我的C
代码是这样的:
#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);
}
为避免缓冲区溢出,我在%9s
中使用scanf
。但我发现输入字符串长度是否短于10
,结果如我所料:
# ./test
short 1 2 3
short,1,2,3
当长度超过或等于10
时,i
,j
和k
无法获得输入:
# ./test
verylongstr 1 2 3
verylongs,0,0,0
如何理解scanf
的行为?
答案 0 :(得分:2)
您告诉scanf
最多可将9个字符读入s
,以便它能做什么。一旦读取了9个字符,它就会尝试将整数读入i
,但下一个输入字符是 t (第十个字符)。无法将其转换为整数,因此扫描将终止,scanf
将返回1,表示它已成功读取单个值。
不幸的是,你永远不会检查返回值。你应该解决这个问题。
t 返回内部缓冲区,因此下一个scanf调用将以该字符开头。