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

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

4

5 回答 5

9

由于 stdin 中已经有换行符,这种情况正在发生。利用

scanf(" %c", &cont); 

代替

scanf("%c", &cont);

注意 %c 前的一个空格。

于 2013-08-22T14:11:42.913 回答
4

消耗完数字(本例中为 45)后scanf("%d", &order);,还剩下一个换行符。您可以使用scanf("%d\n", &order)它来消耗回报。

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

scanf() 将新行字符留在缓冲区中?

于 2012-11-14T04:18:35.570 回答
3

这就是为什么scanf通常不首选字符输入的原因。在前一个输入之后有一个左回车。

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

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

于 2012-11-14T04:17:37.560 回答
1

您可以使用 fflush()

printf("enter cont y or n: ");
fflush(stdin);
scanf("%c", &cont);
于 2012-12-13T09:03:05.747 回答
1

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

C - 试图读取单个字符

这也在scanf文档中进行了解释,但它令人困惑,并且可能更好地使用其他人提到的其他东西。

于 2012-11-14T04:40:46.980 回答