scanf()函数不起作用?

时间:2013-08-25 03:15:55

标签: c

这可能是一个简单的问题,但我搜索了很多但仍未弄明白。 我用gcc编译下面的剪辑代码并从终端运行程序。在正确的情况下,它允许输入int和char,但它不允许。它不等待进入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;

}

5 个答案:

答案 0 :(得分:6)

%d将读取连续数字,直到遇到非数字。 %c读取一个字符。可能发生的事情是你给它一个数字(几位数)后跟一个新行。 %c然后读入新行。您可能打算让fflush(stdin);丢弃尚未阅读的内容,但不幸的是,that's undefined behavior

解决方案是在阅读角色之前丢弃所有空格:

scanf(" %c", &c);

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

答案 1 :(得分:2)

您可以使用getchar()来实现您的目标。

或使用以下内容消费额外的换行符: -

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

原因: - 您读取字符的下一个scanf只读取/消耗换行符,因此永远不会等待用户输入

答案 2 :(得分:2)

而不是fflush(stdin); scanf("%c", &c);

1.使用额外空格的scanf

scanf(" %c",&c); 

2.使用getchar()两次,第一次读取'\ n',在给出整数输入后输入,第二次调用请求您输入c:

getchar();
c=getchar();

会帮助你。

答案 3 :(得分: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编译器上测试/运行。

答案 4 :(得分:0)

fflush()不能保证做任何事情,gcc / g ++不能。不管怎么说,不是在Linux上。

我以为我发明了以下方法来冲洗其余部分...直到我在ISO C规范中看到它作为一个例子(90或99 ...忘记了哪一个,但它已经存在很长时间了方式...我敢打赌,大多数读者以前见过它。)

的scanf( “%* [^ \ n]的% C”); / 放弃所有内容,包括下一个换行符* /

你可以把它放在你自己的“刷新”功能中,以便在整个地方保存打字或粘贴。

您仍应按照建议在scanf(“%c”,&amp; c)中添加空格;

如果有前导空格或双击输入键,那将耐心等待非空白字符。