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);
在前导空格或输入键双击的情况下,这将耐心地等待非空白字符。