scanf第二次不会要求输入

时间:2012-11-14 04:12:23

标签: c scanf

#include "stdio.h"

int main(void)
{

     int order, nextp, N=3;
     char cont;
     nextp = 0;
     printf("\nShould we continue (y or n): ");
     scanf("%c", &cont);
     if (cont != 'y') return;
     for(; nextp < N; nextp++)
     {
        printf("Enter order number: ");
        scanf("%d", &order);
        printf("you have entered %d\n", order);
        printf("okay now continue with cont\n");


        printf("enter cont y or n: ");
        scanf("%c", &cont);
        if (cont != 'y')
        {
            printf("\nnot equal to y\n");
            break;
        }
        printf("after intepreting t[0]");
      }

   return 0;
}

输出看起来像这样

Should we continue (y or n): y
Enter order number: 45
you have entered 45
okay now continue with cont
enter cont y or n: 
not equal to y

跳过了第二个输入。为什么呢?

5 个答案:

答案 0 :(得分:8)

因为stdin中已经有换行符,所以这种情况正在发生。 使用

scanf(" %c", &cont); 

而不是

scanf("%c", &cont);

注意%c之前的一个空格。

答案 1 :(得分:3)

这就是为什么scanf通常不是字符输入的首选。在上一次输入之后有一个剩余的回车符。

例如,如果您在订单输入后添加getchar(),则问题将得到解决,但这不是干净的代码。您也可以通过将cont != 'y'替换为cont != '\n'来明确地看到这一点。

相反,请对所有输入使用getchar()并检查\ n

答案 2 :(得分:3)

scanf("%d", &order);消耗数字后(本例中为45),之后仍然会有新行。您可以使用scanf("%d\n", &order)使其消耗回报。

另一个答案可以在这里找到:

scanf() leaves the new line char in buffer?

答案 3 :(得分:1)

对于大多数转换,scanf将跳过空格,但对于char格式(“%c”),您必须使用格式(“%c”)中的显式空格跳过空格,如下所述:

C - trying to read a single char

scanf文档中也对此进行了解释,但令人困惑的是,使用别人提到的其他内容可能会更好。

答案 4 :(得分:1)

您可以使用fflush()

printf("enter cont y or n: ");
fflush(stdin);
scanf("%c", &cont);