忽略在while循环中的第二次运行,C

忽略在while循环中的第二次运行,C,c,C,当我第二次尝试运行此循环时,它会打印“输入一个句子”,但跳过get部分。不稳定地询问答案,以便再次运行循环。我可以使用scanf如果没有问题,我需要空白 程序将看起来像 输入一句话:你 你 再来一次?是/否:是 不错的选择 输入一句话: 再来一次?是/否: int main(void){ char user_input[20]; int boolean = 0; char val[2]; do{ printf("Enter a sentence: ");

当我第二次尝试运行此循环时,它会打印“输入一个句子”,但跳过
get
部分。不稳定地询问答案,以便再次运行循环。我可以使用
scanf
如果没有问题,我需要空白

程序将看起来像

输入一句话:你

再来一次?是/否:是

不错的选择

输入一句话:

再来一次?是/否:

int main(void){
  char user_input[20];
  int boolean = 0;
  char val[2];

  do{
      printf("Enter a sentence: ");
      gets(user_input);

      printf("%s\n", user_input);

      printf("One more time? y/n: ");
      scanf("%c", &val[0]);

      if(val[0] == 'y'){
        boolean = 1;
        printf("Good choice!\n");
      }else if(val[0] == 'n'){
        printf("You are really quiting?\n");
        boolean = 0;
      }

  }while(boolean);
  return 0;
}

输入y/n的ans时,scanf()接受字符,换行符由get()接受。。 您的代码需要这样做一点修改

int main(void)
{
     char user_input[20];
     int boolean = 0;
     char val[2];

  do{
     printf("Enter a sentence: ");
     gets(user_input);

     printf("%s\n", user_input);

     printf("One more time? y/n: ");
     scanf("%c", &val[0]);
     getchar();

     if(val[0] == 'y')
     {
         boolean = 1;
         printf("Good choice!\n");
     }
     else if(val[0] == 'n')
     {
         printf("You are really quiting?\n");
         boolean = 0;
     }

  }while(boolean);

 return 0;
}

getchar()函数接受换行符…因此,gets()不接受换行符,并且不会发生错误…

这是因为您的stdin缓冲区中仍有新行字符,因此“gets”接受换行符
该换行符作为输入,您没有机会输入您的换行符。
在scanf之后使用getchar()读取换行符,如:

scanf("%c", &val[0]);
getchar();
或者,您可以在scanf功能内进行一些调整:

scanf("\n%c", &val[0]); // insert a newline character in the beginning.

在扫描出
y/n
答案之后,输入流中可能仍然有一个换行符。因为它仍然在那里,当它出现时,它只会从缓冲器中得到一个新行,并考虑输入完成。没有工作,我在“进入句子”之前先划出新的线,这是无关的。那是斯道特。用户点击
Y
FYI:
gets
时,stdin中仍然会出现一条新行:
gets
太糟糕了,甚至被C99标准抛弃了(尽管他们都是为了向后兼容的坚持者,这是正确的)。关于它,你需要知道的唯一一件事就是“永远不要使用它!”@Khairlbasar:如果你阅读手册页,它会清楚地在bug标签下写着“永远不要使用gets”。获取并不是最好的方法。您可以使用“fgets”来读取字符串。注意:
scanf(“%c”,&val[0])
scanf(“\n%c”,&val[0])具有相同的效果:在将
char
扫描到
val[0]
之前,使用可选的前导空格,