getchar()的作用

来源:互联网 发布:人工智能的未来 pdf 编辑:程序博客网 时间:2024/06/14 07:08

以下面的例子做解析

while(scanf("%d%d",&m,&n)!=EOF){ getchar();for(i=1;i<=m;i++){getchar();for(j=1;j<=n;j++){scanf("%c",&ch);

scanf函数在"%d"控制下不接收回车,只把回车作为接收前面输入的数据的命令,且把回车留在输入缓冲区里。如果后面接着有读取字符的函数,如scanf("%c",&ch);,那么,由于回车('\n')也是字符,接收字符的函数就不等从键盘输入而直接把前面的scanf("%d...);遗留在输入缓冲区里的'\n'接收并赋给对应变量,导致出错;所谓“吃掉”,就是在前面的输入语句遗留了'\n',而在后面的读字符语句之前加一句getchar();,因getchar();也接收一个字符,就把遗留在缓冲区里的'\n'接收掉以避免后面的字符输入语句出错的意思。

样例代码中由于scanf("%d%d",&m,&n)会把'\n'留在输入缓冲区,而后面又有scanf("%c",&ch);接收字符语句,所以在二者中间加了getchar();起把遗留在缓冲区里'\n'“吃掉”的作用。

接收数字的scanf("%d....)是不接收字母的,它在遇到' '、'\n'、'\t'及字母时认为前面的数字输入完毕,将“跳过”这些符号读取下一个数字(如果有对应接收功能的话),所以不存在这一问题,只有后面跟着接收字符的语句时才有上述弊端。


%s是接收字符串,而%c是接收字符。它们都要以回车来作为接收命令,都会把回车留在缓冲区里。如果后面还有scanf("%s...);,由于scanf("%s...);不接收(实际是接收并扔了)'\n'而不影响正确输入,并继续把第二个'\n'留在缓冲区里。如果后面是scanf("%c"...);,情况就不太一样,因为scanf("%c"...);接收字符,它把'\n'接收掉,缓冲区里也就不再有东西了。

原创粉丝点击