0
char c;
char s[32];
puts("Type a char");
c=getchar();
fflush(stdin);
puts("Type a string");
fgets(s,32,stdin);

如果没有 fflush(),如果你输入一个字符,比如“a”,然后按回车,输入缓冲区包含“a\n”,getchar() 会窥视“a”,但“\n”仍保留在缓冲区,因此下一个 fgets() 将找到它并返回一个空字符串,甚至无需等待用户输入。

应该怎么做?据我所知,在输入流上使用 fflush() 没有定义或标准?

4

3 回答 3

2

getchar当您的意图是读取一行输入并从中解释一个字符时不要使用。在这种情况下,请阅读带有fgets或类似内容的行,然后只检查第一行。

或者,您可以坚持使用getchar,但是您需要继续阅读字符直到行尾并在继续之前将它们扔掉。

您的程序可以转换为(第一种方法):

char c;
char s[32];
puts("Type a char");
fgets(s,32,stdin);
c=s[0];
puts("Type a string");
fgets(s,32,stdin);

请注意,这缺少对返回值的检查,并且不处理超过 32 个字节的输入,但这是一个开始,这些是您可以处理的单独问题。

于 2015-03-10T03:21:59.420 回答
1

如果您尝试丢弃输入行的其余部分,请执行以下操作:

int ch;
while ( (ch = getchar()) != '\n' && ch != EOF) { }

这会读取字符直到没有更多字符,或者它到达行尾。

请注意,您应该使用int c;而不是char c;. 该getchar()函数实际上没有返回char值;它返回将该 char 转换为unsigned char.

于 2015-03-10T06:17:33.687 回答
0

阅读fflush(3);您可能想先打电话fflush(NULL); c=getchar();但这可能无法如您所愿。

请记住,在 Linux 上,至少终端通常是内核缓冲的(并且也是stdio缓冲的)。阅读有关tty -s 的更多信息。因此,在用户按下键之前,您通常不会得到任何输入enter

您应该重新考虑您的程序并阅读整行(通常在足够大的缓冲区上使用getline(3)fgets(3) )。

如果你想在 Linux(或其他 POSIX 系统)上获得单独的按键,你需要一个像ncurses这样的库(它在原始模式下与终端一起工作)。您可能对readline(3)感兴趣

于 2015-03-10T06:25:29.427 回答