scanf()函数不起作用?

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

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

#include  int main() { char c; int i; // a printf("i: "); fflush(stdin); scanf("%d", &i); // b printf("c: "); fflush(stdin); scanf("%c", &c); return 0; 

}

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

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

 scanf(" %c", &c); 

注意开始时的空间。 这意味着丢弃所有空格。

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

或使用以下方式消费额外换行: –

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

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

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

1.使用额外空间的scanf

 scanf(" %c",&c); 

要么

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

 getchar(); c=getchar(); 

会帮助你。

首先, 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编译器上测试/运行。

fflush()不能保证做任何事情,而gcc / g ++则没有。 反正不是在Linux上。

我以为我发明了以下方法来冲洗剩下的一行…直到我在ISO C规范中看到它作为一个例子(90或99 …忘记了哪一个,但它已经有很长一段时间了…我敢打赌,这里的大多数读者都曾见过它。)

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

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

您仍应按照建议在scanf中放置一个空格(“%c”,&c);

在前导空格或输入键双击的情况下,这将耐心地等待非空白字符。