4

这可能是一个简单的问题,但我搜索了很多,仍然没有弄明白。我通过 gcc 编译下面的代码片段并从终端运行程序。正确的是,它允许输入一个 int 和一个 char 但它不允许。它不等待输入字符?

这里的任何人都可以帮助我。提前致谢!

#include <stdio.h>

int main()
{

  char c;
  int i;

  // a
  printf("i: ");
  fflush(stdin); scanf("%d", &i);

  // b
  printf("c: ");
  fflush(stdin); scanf("%c", &c);

  return 0;

}

4

5 回答 5

8

%d将读取连续的数字,直到遇到非数字。%c读取一个字符。可能正在发生的事情是你给它一个数字(几个数字),然后是一个新行。%c然后读入该新行。您可能打算fflush(stdin);丢弃任何尚未阅读的内容,但不幸的是,这是未定义的行为

解决方案是在读取字符之前丢弃所有空格:

scanf(" %c", &c);

注意开头的空格。这意味着丢弃所有空格。

于 2013-08-25T03:20:14.660 回答
2

代替fflush(stdin); scanf("%c", &c);

1.使用带有额外空间的scanf

scanf(" %c",&c); 

或者

2.使用getchar()两次,第一次读取'\ n',这是在给出整数输入后输入的,第二次调用要求你输入为c:

getchar();
c=getchar();

会帮助你。

于 2013-08-25T03:22:30.373 回答
2

您可以使用getchar()来实现您想要的。

或使用以下方法消耗额外的换行符:-

 scanf(" %c", &c);
  ^^^   <------------Note the space

原因:- 您用于读取字符的下一个 scanf 只是读取/使用换行符,因此从不等待用户输入

于 2013-08-25T03:19:27.043 回答
1

首先,scanf按指示使用时有效。我认为以下代码可以满足您的要求。刷新标准输出,以便提示用户输入整数或字符。使用 %1s 允许像 \n 这样的空白。

int main()
{

  char c[2];
  int i;

  printf("i: ");
  fflush(stdout);
  scanf("%d", &i);

  printf("c: ");
  fflush(stdout);
  scanf("%1s", &c);

  printf("\ni = %d, c = %c", i, c[0]);

  return 0;

}

此代码已在 Eclipse/Microsoft C 编译器上测试/运行。

于 2013-08-25T03:36:49.610 回答
0

不保证 fflush() 会做任何事情,而 gcc/g++ 则不会。无论如何,不​​在Linux上。

我以为我发明了以下方法来刷新一行的其余部分……直到我将其视为 ISO C 规范中的一个示例(90 或 99……忘记了,但不管怎样,它已经存在了很长时间…… .而且我敢打赌这里的大多数读者以前都看过。)

scanf("%*[^\n]% c"); /丢弃直到并包括下一个换行符的所有内容 */

你可以把它放在你自己的“flush”函数中,以节省打字或粘贴的地方。

您仍然应该按照建议在 scanf(" %c", &c); 中放置一个空格。

如果出现前导空格或双击回车键,这将耐心等待非空白字符。

于 2013-08-25T03:39:21.423 回答