为什么我的printf()语句被运行两次?

时间:2017-05-16 23:18:32

标签: c printf

在初始迭代之后,printf()输出每次迭代显示两次。为什么呢?

int main()
{
  int ch;
  for( ch = ' '; ch != 'q'; ) {
     printf("Enter a character: ");
     ch = getchar();
  }
  printf("You entered a q!\n");

  return 0;
}

终端输出为:

Enter a character: w
Enter a character: Enter a character: a
Enter a character: Enter a character: q
You entered a q!

4 个答案:

答案 0 :(得分:4)

您没有在命令行中输入w。您输入了w\n。这是两个角色。

答案 1 :(得分:2)

因为getchar读取了一个字符而且' \ n'不仅是您输入的字符。

答案 2 :(得分:0)

正如大家已经说过的那样,getchar()正在消耗换行符('\ n'),这使得你有两次迭代。解决这个问题的方法是:

int main(){
  int ch;
  for( ch = ' '; ch != 'q'; ) {
     printf("Enter a character: ");
     ch = getchar();
     getchar();
  }
  printf("You entered a q!\n");

  return 0;
}

第二个getchar()的原因是使用该换行符,因此您不会有同一事物的双倍输出。只有在输入一个字符时才能使用此方法。

答案 3 :(得分:0)

正如评论和之前的答案所述,getchar()最后没有读取换行符。快速解决方法是在循环结束时添加另一个getchar();,如下所示:

int main()
{
  int ch;
  for( ch = ' '; ch != 'q'; ) {
     printf("Enter a character: ");
     ch = getchar();
     getchar();
  }
  printf("You entered a q!\n");

  return 0;
}

如果您想要一个更灵活的解决方案,如果用户输入多个字符,那么请尝试以下方法:

int main()
{
  int ch;
  for( ch = ' '; ch != 'q'; ) {
     printf("Enter a character: ");
     ch = getfirstchar();
  }
  printf("You entered a q!\n");

  return 0;
}
int getfirstchar() {
  int c = getchar();
  while(getchar() != '\n')
    ;
  return c;
}

我将这个角色的阅读变成了一个单独的功能,因此它更适合未来的代码。