scanf 和 getchar 处理流的方式不同吗?
Do scanf and getchar handle stream differently?
我对 scanf 和 getchar 处理流的方式不同感到困惑,以下是示例代码:
while(scanf("%d", &input) != 1)
{
while((ch = getchar()) != '\n')
{
putchar(ch);
}
printf("\nThis is wrong\n");
}
printf("That is right\n");
这是一个用于测试输入是否为整数的简单程序。内部 while 循环用于在单击 Enter 之前显示每个错误的输入值。当我输入一个随机字符串如:
qwert
putchar 将打印出准确的字符串。但是,如果我更换
while(scanf("%d", &input) != 1)
与
while((ch = getchar()) != '\n')
并打印出完全相同的字符串,第一个字母 "q" 被删除。
所以我的问题是外循环中的 scanf 和 getchar 如何以不同方式处理这种情况?
当您使用 scanf
尝试读取一个整数,并且您提供的一些输入 不是 整数时,scanf
将失败并且不是 return 1
。然而,它将保持输入完好无损,它不会从输入中提取任何内容,而是将其全部留给您的内部循环来消化和打印。
如果在外循环中使用 getchar
,它实际上会消耗一个字符,无论它是什么字符,而内循环将看不到该字符,因为它不存在于输入缓冲区了。
我对 scanf 和 getchar 处理流的方式不同感到困惑,以下是示例代码:
while(scanf("%d", &input) != 1)
{
while((ch = getchar()) != '\n')
{
putchar(ch);
}
printf("\nThis is wrong\n");
}
printf("That is right\n");
这是一个用于测试输入是否为整数的简单程序。内部 while 循环用于在单击 Enter 之前显示每个错误的输入值。当我输入一个随机字符串如:
qwert
putchar 将打印出准确的字符串。但是,如果我更换
while(scanf("%d", &input) != 1)
与
while((ch = getchar()) != '\n')
并打印出完全相同的字符串,第一个字母 "q" 被删除。 所以我的问题是外循环中的 scanf 和 getchar 如何以不同方式处理这种情况?
当您使用 scanf
尝试读取一个整数,并且您提供的一些输入 不是 整数时,scanf
将失败并且不是 return 1
。然而,它将保持输入完好无损,它不会从输入中提取任何内容,而是将其全部留给您的内部循环来消化和打印。
如果在外循环中使用 getchar
,它实际上会消耗一个字符,无论它是什么字符,而内循环将看不到该字符,因为它不存在于输入缓冲区了。