如果scanf()得到一些与格式字符串不匹配的字符,会发生什么?

时间:2015-04-10 01:22:24

标签: c scanf

#include <stdio.h>

int main(void)
{
    int i, j, k;
    scanf("%d%d%d", &i, &j, &k);
    printf("%d %d %d", i, j, k);
    return 0;
}

如果我们输入1,2,3,会发生什么?为什么?

根据https://stackoverflow.com/a/18297691/2646069,如果scanf()读取意外字符串,它将提前返回,因此不会在最后一个成功值之后修改任何值。

我在-O0上尝试了clang(LLVM 6.1.0),上面的解释是正确的,但在-O2上,第二个变量总是一个随机数,但与scanf()之前不一样1}},第三个变量始终为0

2 个答案:

答案 0 :(得分:4)

根据the manualscanf的返回值告诉您使用这些参数是否安全。

  

成功完成后,这些函数将返回成功匹配和分配的输入项的数量;如果早期匹配失败,此数字可以为零。如果输入在第一次匹配失败或转换之前结束,则返回EOF。如果发生读取错误,则设置流的错误指示符,返回EOF

如果您输入1,2,3,则scanf将返回1,表示第一个参数可以安全使用,并且第一个,发生匹配失败因为它与根据格式字符串的预期输入不匹配。

如果您在此之后使用jk,那么您的代码将使用不确定的值,这是未定义的行为,显然是要避免的不稳定行为的来源... 检查scanf 的返回值非常重要,因为您使用的链接也鼓励。

答案 1 :(得分:0)

explanation给出的是正确的。 scanf会在输入中找到,时停止并返回。因此,jk将被取消初始化。未初始化的变量具有不确定的值,如果它是陷阱表示,则会调用未定义的行为。