清空输入缓冲区时,getch()和getchar()的使用方法有什么区别?

3

代码1:

char ch1, ch2;

printf("Input the first character:");

scanf("%c", &ch1); 

while(getchar()!='\n');

printf("Input the second character:");

ch2 = getchar();

在这种情况下,while(getchar()!='\n');清除了第一个输入按下的回车键效果。
代码2:
char ch1, ch2;

printf("Input the first character:");

scanf("%c", &ch1); 

while(getch()!='\n');

printf("Input the second character:");

ch2 = getchar();

在这种情况下,while(getch()!='\n');不会清除第一个输入的enter-key的效果。因此循环无限执行。
在这种情况下,getch()getchar()的功能有什么区别?
3个回答

2

getch()会返回KEY_ENTER而不是'\n'当它读取回车键时,这意味着你的while循环永远不会终止。

man getch

注意,有些键可能与常用控制键相同,例如,KEY_ENTER与control/M相对应,KEY_BACKSPACE与control/H相对应。一些curses实现可能根据它们是否特别处理这些控制键(并忽略terminfo),或者使用terminfo定义而不同。ncurses使用terminfo定义。如果它说KEY_ENTER是control/M,那么当按下control/M时,getch将返回KEY_ENTER。


1

getch()来自curses.h,其作用是:

从curses终端键盘获取字符。

getchar()来自stdio.h,其作用是:

从[stdin]读取下一个字符并将其作为无符号字符转换为int返回,如果到达文件结尾或出现错误则返回EOF。

因此,你的第一个示例从scanf()调用留在stdin上的换行符('\n')中读取,一切正常。

在您的第二个示例中,您没有使用或链接curses,因此在无延迟模式下,如果没有输入等待,则getch()将返回值ERRERR-1'\n'10。它们不匹配,因此您会进入一个无限循环,等待-1==10


1

int getchar(void)int getch(void); 的区别:

两者都返回一个 int 值。

两者都可能返回超出 8 位范围的值,因此在保存结果时,应该将其保存在一个 int 中。

--

两者之间的区别:

getchar()在C规范中。而getch();则不在。

getchar()的返回值将显示在屏幕上,而getch()则不会。

如果出现EOF条件,getchar()将进入无限循环,最好使用:

int c; 
while((c = getchar()) !='\n' && c != EOF);

getch()会在出错或超时时返回ERR。在不同的系统上,其功能可能有所不同 - C语言没有做出具体规定。一些系统允许在队列中没有键时立即返回。

按下Enter键时,getchar()会返回'\n'
getch()会返回键码,可能匹配'\n''\r'或其他字符。
这是OP面临的直接问题。@Ingo Leonhardt


两种方法都不会进入无限循环。 - kevin gomes
@kevin gomes 如果发生文件结束条件,getchar() 将进入无限循环。你没有遇到这个问题是因为你没有终止标准输入(stdin)。不同的终端有不同的方法,有些使用Ctrl-D或Ctrl-Z,还有其他方式。EOF与Enter键是不同的。 - chux - Reinstate Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接