scanf不会在第二次请求输入时询问。

6
#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

第二个输入框被跳过了,为什么?

这个问题在 Stack Overflow 上已经讨论了无数次。请尝试研究现有的相关问题。 - fkl
5个回答

11
因为标准输入中已经存在换行符,所以出现了这种情况。使用

scanf(" %c", &cont); 

取代

scanf("%c", &cont);

在%c之前注意留一个空格。


4
在执行scanf("%d", &order);后,即使数字(在本例中为45)被读取了,仍然会留下一个换行符。您可以使用scanf("%d\n", &order)来读取回车符。
这个问题的另一个答案可以在这里找到:scanf() leaves the new line char in buffer?

3
这就是为什么通常不建议使用scanf进行字符输入。在之前的输入后留下了一个多余的回车符。
例如,如果您在订单输入后添加一个getchar(),您的问题将得到解决,但这不是干净的代码。您还可以通过将cont != 'y'替换为cont != '\n'来明确地查看这一点。
相反,对于所有输入,请使用getchar()并检查\n。

好的,我一会儿试试。但是我尝试了 fgets(..),它也有问题,而且它本应该更安全。 - user1012451
再次强调,fgets函数会在输入的字符串末尾包含换行符。因此,在使用该函数获取输入后,需要将换行符替换为null字符。 - John

1
对于大多数转换,scanf将跳过空格,但对于字符格式(“%c”),您必须使用格式中的显式空格(“%c”)来跳过空格,如此处所述:
C - trying to read a single char 这也在scanf文档中解释了,但它很令人困惑,最好使用其他方法,正如其他人所提到的那样。

1

您可以使用fflush()函数

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接