C程序在第一个getchar()后关闭。

3
为什么以下代码片段在第一个输入后就关闭了呢?
#include <stdio.h>
int main( ) {

   int a;
   int b;
   printf( "Enter a first value :");
   a = getchar( );

   printf( "You entered: ");
   putchar( a );

   printf( "\n Enter a second value :");
   b = getchar( );
   return 0;
}

程序在打印后关闭。
"Enter a second value :"

在我看来,getchar 需要一个 newline 是有问题的,这已经引起了无数的麻烦和问题,并且这些问题还会不断涌现。如果 MSVC 做对了一件事情,那就是它的 getchkbhit,虽然它们没有解决使用 scanf 函数族时类似的问题。 - Weather Vane
可能是为什么我的教授使用了两个getchar();?的重复问题。 - anatolyg
不确定混淆是什么。 - Ryan
@WeatherVane getchar() 不需要换行符。发生的情况是伪终端的一个特性,称为行缓冲 - 它不会将任何输入发送到程序,直到键入换行符。如果需要 getch()kbhit() 的行为,则有方法可以禁用或绕过行缓冲。 - twalberg
@twalberg 谢谢,正如你所说, 默认行为确实需要一个 newline - Weather Vane
2个回答

1

b = getchar( );b分配给输入流中第一个输入留下的换行符。


1

检查 getchar 的返回值

while (((b = getchar()) != '\n') && (b != EOF)) { }

检查一下您两个调用getchar的代码

int main()
{
   int a;
   int b;
   printf( "Enter a first value :");
   while (((a = getchar()) != '\n') && (a != EOF)) { }

   printf( "You entered: ");
   putchar( a );

   printf( "\n Enter a second value :");
   while (((b = getchar()) != '\n') && (b != EOF)) { }
   return 0;
}

1
需要在(b = getchar()) != '\n'b != EOF周围加上括号,因为&&的优先级高于!===。否则正确。你现在写的是(b = getchar()) != ('\n' && b) != EOF - SIGSTACKFAULT
没问题,我也经常犯这个错误。 - SIGSTACKFAULT
1
不需要使用括号来使 && 运算符按预期工作。括号不会有任何影响(除了可读性),但也不是必需的。您可以查看运算符优先级或者根据常识判断:像 x != 1 && x != 2 这样的表达式在 C 中得到支持,并且经常出现在代码中。 - anatolyg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接