我正在学习C,我正在使用“getchar()”来停止命令窗口,这样我就可以看到练习在做但是它不起作用。下面是一个样本:
#include <stdio.h>
int main()
{
int value;
printf("1. option 1.\n2. option 2.\n3. option 3.\n4. Exit\n\nMake an option: ");
scanf("%d", &value);
switch (value)
{
case 1:
printf("you selected the option 1.");
break;
case 2:
printf("you selected the option 2.");
break;
case 3:
printf("you selected the option 3.");
break;
case 4:
printf("goodbye");
break;
default:
printf("thats not an option");
break;
}
getchar();
return 0;
}
这是输出:
- 选项1。
- 选项2。
- 选项3。
- 退出。
醇>选择:1
您选择了选项1。
进程返回0(0x0)执行时间:3.453 s
按任意键继续。
为什么不等待“getchar()”的输入?
答案 0 :(得分:22)
您的scanf只吃了数字而不是尾随换行符。在%d之后添加换行符或空格会给你带来相反的问题,读得太远了。
这就是为什么人们不喜欢scanf。
我建议您阅读实际行(使用fgets(3)
),然后使用sscanf()
扫描字符串。
答案 1 :(得分:8)
首先,不使用fflush()来清除输入流;行为未定义:
7.19.5.2.2如果流指向输出流或最新的流更新流 如果没有输入操作,fflush函数会导致该流的任何未写入数据 要传递到主机环境以写入文件;否则,行为是 未定义。
问题是“%d”转换说明符没有使用尾随换行符,因此getchar()
会立即拾取它。没有一种最好的方法可以解决这个问题,但通常的方法是将整行读作文本(使用fgets()
或scanf()
并使用大小为“%s”的转换说明符),这将消耗换行符,然后使用sscanf()
或strtol()
或strtod()
转换为目标数据类型。
答案 2 :(得分:3)
getchar可以获得你在1之后输入的回车吗?
答案 3 :(得分:2)
getchar()正在scanf中从键盘读取\ n - 有关详细信息,请参阅here
答案 4 :(得分:2)
我认为你在输入“1”后输入了一个输入。它将被getchar()
接受。因此,只需在原始版本之后添加getchar()
(在return 0;
之前)即可解决问题。
**我测试过这个并且有效。
答案 5 :(得分:2)
你得到一个回车,我绕过它的方式,定义一个字符,然后让它扫描回车,
char ch;
(在你的getch()之前输入以下内容)
scanf("%c",&ch);
getchar();
应该以这种方式工作,而不是最有效的方式,但对我有用。
答案 6 :(得分:1)
如上所述,scanf在读取用户输入后离开\ n
Soultion:在scanf之后直接添加getchar()。
补偿了scanf缺陷。
即
int value;
printf("1. option 1.\n2. option 2.\n3. option 3.\n4. Exit\n\nMake an option: ");
scanf("%d", &value);
getchar();
switch (value)
答案 7 :(得分:0)
在阅读其他答案时,我发现您可以使用scanf("%d\n",&n);
而不是scanf("%d",&n);
从缓冲区中删除新行。我还没有检查出来。
希望它有效:D
答案 8 :(得分:-2)
#include <stdio.h>
#include<conio.h>
void main()
{
int value;
printf("1. option 1.\n2. option 2.\n3. option 3.\n4. Exit\n\nMake an option: ");
scanf("%d", &value);
switch (value)
{
case 1:
printf("you selected the option 1.");
break;
case 2:
printf("you selected the option 2.");
break;
case 3:
printf("you selected the option 3.");
break;
case 4:
printf("goodbye");
break;
default:
printf("thats not an option");
break;
}
getch();
}
答案 9 :(得分:-9)
为了让你的程序工作,你应该在调用getchar()并调用fflush(stdin)之前“刷新”你的输入流。这样做的是,当你键入一个数字然后键入返回键时,输入缓冲区会获得两个字符,例如'1'和'\ n',而你对scanf的调用只获得'1'所以' \ n'保留在输入缓冲区中。当你打电话给getchar时,你仍然会“保持”'\ n'。刷新输入会丢弃所有缓冲区。