简单的C scanf不起作用?

时间:2010-09-19 06:41:27

标签: c console 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 first)时,它工作正常。究竟是什么错?

5 个答案:

答案 0 :(得分:25)

使用scanf读取输入时,按下返回键后会读取输入,但返回键生成的换行不会被scanf消耗,这意味着下次读取{{来自标准输入的{1}}将有一个准备好读取的换行符。

要避免的一种方法是使用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 FAQ : Why does everyone say not to use scanf?

答案 1 :(得分:14)

其他答案都是正确的 - %c不会跳过空格。最简单的方法是在%c

之前放置空格
scanf(" %c", &achar);

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

答案 2 :(得分:5)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

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