简单的C scanf不起作用?

如果我尝试以下内容:

int anint; char achar; printf("\nEnter any integer:"); scanf("%d", &anint); printf("\nEnter any character:"); scanf("%c", &achar); printf("\nHello\n"); printf("\nThe integer entered is %d\n", anint); printf("\nThe char entered is %c\n", achar); 

它允许输入一个整数,然后完全跳过第二个scanf ,这真的很奇怪,因为当我交换两个(首先是char scanf)时,它工作正常。 究竟是什么错了?

当使用scanf读取输入时,在按下返回键后读取输入,但是返回键生成的换行不被scanf消耗,这意味着下次从标准输入读取char ,将有一个新行准备好读。

要避免的一种方法是使用fgets将输入作为字符串读取,然后使用sscanf提取所需内容:

 char line[MAX]; printf("\nEnter any integer:"); if( fgets(line,MAX,stdin) && sscanf(line,"%d", &anint)!=1 ) anint=0; printf("\nEnter any character:"); if( fgets(line,MAX,stdin) && sscanf(line,"%c", &achar)!=1 ) achar=0; 

另一种使用换行符的方法是scanf("%c%*c",&anint);%*c将从缓冲区中读取换行符并将其丢弃。

你可能想读这个:

C FAQ:为什么每个人都说不使用scanf?

其他答案是正确的 – %c不会跳过空格。 最简单的方法是在%c之前放置空格:

 scanf(" %c", &achar); 

(格式字符串中的任何空格都会使scanf消耗所有连续的空格)。

它没有跳过第二个scanf() ; 第二个scanf()读取第一个scanf()留下的换行符。 大多数格式代码跳过空格; %c格式不会跳过空格。

每次printf调用后也请尝试使用_flushall()。 。 基本上,默认情况下,MS的C ++缓冲流输出,并且刷新导致输出流为空。

scanf之前调用getchar()也会清除存储的换行符。 更轻巧但更具情境性

 char input_1; char input_2; getchar(); scanf("%c", &input_1); getchar(); scanf("%c", &input_2); 

将刷新换行符,在连续的代码行中更有用,你知道它只有一个排队值而不是字符串