为什么scanf不能为输入参数赋值?

时间:2016-11-08 02:37:00

标签: c scanf

我的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时,ijk无法获得输入:

# ./test
verylongstr 1 2 3
verylongs,0,0,0

如何理解scanf的行为?

1 个答案:

答案 0 :(得分:2)

您告诉scanf最多可将9个字符读入s,以便它能做什么。一旦读取了9个字符,它就会尝试将整数读入i,但下一个输入字符是 t (第十个字符)。无法将其转换为整数,因此扫描将终止,scanf将返回1,表示它已成功读取单个值。

不幸的是,你永远不会检查返回值。你应该解决这个问题。

t 返回内部缓冲区,因此下一个scanf调用将以该字符开头。