【问题标题】:scanf won't ask for input the second time [duplicate]scanf第二次不会要求输入[重复]
【发布时间】:2012-11-02 14:25:15
【问题描述】:
#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

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

【问题讨论】:

  • 这已经在 SO 上讨论了无数次。尝试对现有问题进行一些研究

标签: c scanf


【解决方案1】:

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

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

改为使用getchar() 输入您的所有输入并检查是否有\n

【讨论】:

  • 好的,我一会儿试试。但我尝试了fgets(..),它也受到了影响,它应该更安全。
  • 同样,fgets 在末尾包含换行符。只需在输入值之前用 null 替换换行符
【解决方案2】:

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

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

scanf() leaves the new line char in buffer?

【讨论】:

    【解决方案3】:

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

    C - trying to read a single char

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

    【讨论】:

      【解决方案4】:

      你可以使用 fflush()

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

      【讨论】:

        【解决方案5】:

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

        scanf(" %c", &cont); 
        

        而不是

        scanf("%c", &cont);
        

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

        【讨论】:

          猜你喜欢
          • 2021-12-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-22
          相关资源
          最近更新 更多