【发布时间】:2015-01-13 14:58:21
【问题描述】:
这个问题一直困扰着我。考虑以下程序:
#include <stdlib.h>
#include <stdio.h>
int main(void){
char one,mid,final;
int num;
printf("Enter the first character:\n");
scanf("%c",&one);
printf("Enter any integer:\n");
scanf("%d",&num);
printf("Enter the middle character:\n");
scanf("%c",&mid);
printf("Enter the final character:\n");
scanf("%c",&final);
printf("You have entered\n");
printf("\"%c\" and \"%d\" and \"%c\" and \"%c\"\n",one,num,mid,final);
return EXIT_SUCCESS;
}
假设输入是
A\n
34\n
B\n
这里,
第一个scanf 得到A 并将\n 留在stdin 中。
第二个nd 不考虑\n,因为%d 跳过它们,因此得到34。这个scanf 还在stdin 中留下\n 字符。
第三个rdscanf 得到第二个scanf 剩下的\n。
第 4 个scanf 得到B 并再次将\n 留在stdin 中。
我的问题是:为什么最后一个 scanf 不消耗第一个 scanf 留下的 \n 字符?
【问题讨论】:
-
第二次 scanf 调用确实消耗了第一次调用中的
\n。它只是丢弃它,并继续阅读。 -
所以
%d在扫描整数之前会吞噬所有空白字符? -
@mafso,
scanf在循环体中刷新stdin,以防第二个scanf失败。scanf不是第一个、第二个、第三个或第四个scanf。这可能会让未来的读者感到困惑,因此我将其删除。 -
这是一个改进,谢谢。但仍然:为什么应该第四个
scanf消耗第一个留在输入流中的东西? -
@CoolGuy:是的,
%d转换说明符告诉scanf使用并忽略任何前导空格,包括换行符。实际上,不告诉scanf使用前导空格的唯一转换说明符是%c和%[转换说明符。请注意,格式字符串中的空格也会消耗空格,因此您可以通过编写scanf( " %c", &c );来避免您的问题(注意%c之前的空格)。