用于清除输入缓冲区的getch()和getchar()的使用差异?

时间:2014-03-20 17:34:45

标签: c input buffer getchar getch

代码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');,清除按下enter-key第一次输入的效果。

代码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 个答案:

答案 0 :(得分:2)

来自man getch

  

请注意,某些键可能与常用的控制键相同,          例如,KEY_ENTER与control / M,KEY_BACKSPACE与control / H.一些          curses实现可能会根据他们是否对待它们而有所不同          特别控制键(并忽略terminfo),或使用terminfo          定义。 Ncurses使用terminfo定义。如果它说的话          KEY_ENTER是control / M,当你按下con时,getch将返回KEY_ENTER          特伦/ M

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

答案 1 :(得分:1)

int getchar(void)int getch(void);

两者都返回int

两者都可以返回8位范围之外的值,因此在保存结果时,它应保存在int中。

-

2:

之间的区别

getchar()符合C规范。 getch();不是。

getchar()的返回值将显示在屏幕上。来自getch()不会。

如果出现EOF条件,

getchar()将进入无限while()循环。更好用:

int c; 
while((c = getchar()) !='\n' && c != EOF);
错误或超时时,

getch()会返回ERR。各种系统上的功能有一些变化 - 它没有在C中指定。如果队列中没有密钥,某些允许选项立即返回。

Enter 时,getchar()会返回'\n'
getch()返回密钥代码。可能与'\n''\r'或其他人匹配 这是OP的直接问题。 @Ingo Leonhardt

答案 2 :(得分:1)

来自curses.h

getch()是:

  

从curses终端键盘获取[ting] ...字符

来自stdio.h

getchar()是:

  

从[stdin]读取下一个字符并将其作为无符号字符串转换为int,或者在文件末尾或错误时返回EOF。

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

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