这可能是一个简单的问题,但我搜索了很多但仍未弄明白。 我用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;
}
答案 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)中添加空格;
如果有前导空格或双击输入键,那将耐心等待非空白字符。