C 为什么printf()语句要运行两次?

C 为什么printf()语句要运行两次?,c,printf,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

初始迭代后,
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!

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

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

因为
getchar
读取一个字符和“\n”,而不仅仅是您键入的字符。

因为
getchar
读取一个字符和“\n”,而不仅仅是您键入的字符。

正如大家已经说过的,
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()
的原因是使用该换行符,这样就不会有相同内容的双重输出。仅当您只输入一个字符时,使用此方法才有效。

正如大家已经说过的,
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()
的原因是使用该换行符,这样就不会有相同内容的双重输出。仅当您只输入一个字符时,使用此方法才有效。

正如注释和以前的答案所述,
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;
}

我将读取字符移动到了一个单独的函数中,这样它更适合未来的代码。

正如注释和前面的答案所述,
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;
}

我将读取字符移动到一个单独的函数中,这样它更适合未来的代码。

您输入的是什么?这是因为换行符。@BLUEPIXY为什么换行符会导致这种行为?@nbro Enter键在
getchar
中作为换行符接收。@BLUEPIXY当然知道,但是为什么循环中的
printf
函数明显执行了两次?您输入的是什么?这是因为换行。@BLUEPIXY为什么换行会导致这种行为?@nbro Enter键在
getchar
中作为换行接收。@BLUEPIXY当然知道,但是为什么循环中的
printf
函数显然执行了两次呢?这不是一个很好的解决方法。仅当用户在该行中输入单个字符时,此选项才有效。更好的解决方法是循环使用
getchar
,直到找到换行符。这不是一个好的解决方法。仅当用户在该行中输入单个字符时,此选项才有效。更好的解决方法是在
getchar
上循环,直到找到换行符。