为什么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. 选项1。
  2. 选项2。
  3. 选项3。
  4. 出口。

做出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丢弃所有的缓冲区。