ungetc()出现意外行为

时间:2017-03-28 06:19:56

标签: c

我喂给 stdin " 11 + 3"使用以下代码和

void main(void) {
    int number;
    printf("the first call : %d\n", scanf("%d", &number));
    char ch = fgetc(stdin);
    ungetc(ch, stdin);
    printf("the second call : %d\n", scanf("%d", &number));
}

结果对我来说似乎很奇怪因为第二个 scanf()应该失败。仅供参考,我在Ubuntu 5.4.0-6ubuntu1~16.04.4下使用了gcc 5.4.0 20160609。

the first call : 1
the second call : 1

1 个答案:

答案 0 :(得分:1)

  

因为第二个scanf()应该失败。

没有。你给它提供了完全有效的输入。

scanf解析输入,直到满足输入或直到它到达分隔符。

在你第一次打电话给scanf时,它解析" 11"作为数字11,然后结束,因为下一个数字不是输入满足的数字的一部分。

在你对scanf的第二次调用中,它解析" + 3"数字3,它是整数形式的正3的有效表达式。就像" -3"本来是负3号。

正如评论中提到的那样,传递" 11 + 3"会导致第二个scanf失败,因为它会尝试解析" +"作为整数(+之后的空格被计为分隔符)。