为什么getchar()等待我在scanf()之后按回车?
我正在学习C,我正在使用“getchar()”来停止命令窗口,所以我可以看到正在做的练习,但它不起作用。 inheritance人样本:
#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。
- 出口。
做出select:1
您select了选项1。
进程返回0(0x0)执行时间:3.453秒
按任意键继续。
为什么不等待“getchar()”的input?
你的scanf只吃了这个数字,而不是后面的换行符。 在%d之后放置一个换行符或空格将会带来相反的问题,读得太多。
这就是为什么人们不喜欢scanf。
我build议阅读一个实际的行(使用fgets(3)
),然后使用sscanf()
来扫描string。
首先,不要使用fflush()来清除inputstream; 行为是未定义的:
7.19.5.2.2如果stream指向一个输出stream或一个没有input最近操作的更新stream,fflush函数会导致该stream的任何未写入的数据被传递到主机环境以写入文件; 否则,行为是不确定的。
问题是尾随的换行符没有被“%d”转换说明符所使用,所以它被getchar()
立即拾取。 没有最好的办法来解决这个问题,但通常的做法是将整行读取为文本(使用带有大小为“%s”的转换说明符的fgets()
或scanf()
),这将消耗换行符,然后使用sscanf()
或strtol()
或strtod()
转换为目标数据types。
getchar()正在从scanf中的键盘读取\ n,在这里查看更多信息
可以getchar得到你回车后,你进入1?
你得到一个回车,我会绕过它的方式,定义一个字符,只是让它扫描回车,
char ch;
(在getch()之前input以下内容) scanf("%c",&ch); getchar();
scanf("%c",&ch); getchar();
应该以这种方式工作,而不是最有效的方式来做到这一点,但为我工作。
正如已经提到的,scanf在阅读用户input后离开了\ 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)
我想你input“1”后input一个回车。 它将被getchar()
所接受。所以你可以通过在原来的之后添加一个额外的getchar()
(就在return 0;
之前getchar()
来解决问题。
**我testing了这个,它的工作。
#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(); }
为了让你的程序能够正常工作,在调用getFile()和fflush(stdin)之前,应该先刷新inputstream。 这是做什么的,当你键入一个数字,然后返回键时,input缓冲区将得到两个字符,例如'1'和'\ n',而您对scanf的调用只会得到'1',所以' \ n'仍然在input缓冲区中。 当你调用getchar时,你正在“开始”剩下的'\ n'。 刷新input丢弃所有的缓冲区。