scanf函数不会要求输入第二次[复制](scanf won't ask for input

2019-06-21 03:26发布

这个问题已经在这里有一个答案:

  • SCANF跳过所有其他while循环用C 10回答
#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

第二输入被跳过。 为什么?

Answer 1:

因为已经在标准输入换行符,这种情况正在发生。 使用

scanf(" %c", &cont); 

代替

scanf("%c", &cont);

注意:%C前一个空间。



Answer 2:

这就是为什么scanf通常不首选字符输入。 有前面的输入之后遗留回车。

例如,如果你要添加getchar()的顺序输入后,您的问题将得到解决,但是这不干净的代码。 您还可以看到这个明确subsituting cont != 'y'cont != '\n'

相反,使用getchar()为所有输入和检查\ n



Answer 3:

scanf("%d", &order); 消耗的数量(45在这种情况下),仍然存在一个新行后留下。 您可以使用scanf("%d\n", &order) ,使其消耗的回报。

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

scanf()的叶子在缓冲区中的新行字符?



Answer 4:

对于大多数转换的scanf会跳过空白,但对字符格式(“%C”),则必须通过格式使用一个明确的空间(“%C”)按如下说明跳过空白:

Ç -试图读取单个字符

这也是在解释scanf函数的文档,但它的混乱,可能会更好,因为其他人所说的用别的东西。



Answer 5:

您可以使用fflush()

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


文章来源: scanf won't ask for input the second time [duplicate]
标签: c scanf