本帖最后由 21228827 于 2018-9-1 15:50 编辑
getchar()函数执行一次会从键盘缓冲区(如果有内容就读取,没有内容就等待用户输入并以回车结束,回车相当于加上一个换行符\n)顺序读取一个字符并返回此ASCII码,举个例子:当我们调用一次getchar()时,然后输入abc并回车,此时abc和\n才一起送入了键盘缓冲区,总共就是4个字符。而此时getchar()由于只运行了一次,所以取到的是a,剩下缓冲区的字符就是bc\n 源程序里while(getchar()!='\n')意思就是一个一个字符读取,直到碰到\n也就是回车就停止(当然\n也就不会被计入累加值)。我们在执行此程序时很直观的感受是输入完一个句子,然后回车马上print,其实回车之后又根据句子长度执行了N次(我有点啰嗦了)
还有一个问题就是有朋友提出视频里getchar()过滤回车的问题,其实就是scanf()比如输入Y并回车之后,scanf只读并取走了一个字符,此时\n也就是回车符依然在键盘缓冲区里(有点像getchar()),此时调用getchar()但又不把他的值赋予其他变量,不正好起到了把那个多余的\n用getchar()“过滤掉”的作用吗,使用之后缓冲区就是空的了,下次调用scanf因为是空的,就会等待用户输入,也就自然不会自动取到遗留的\n
我一开始也是没搞懂,后来自己动手写了几次程序才摸懂了原理,表达不是很好,不对的地方请大神指正
#include <stdio.h>
int main(int argc, char *argv[])
{
char test1;
char test2;
char test3;
char test4;
scanf("请输入:%c%c%c" ,&test1,&test2,&test3);
test1=getchar();
test2=getchar();
test3=getchar();
test4=getchar();
printf("test1=%d test2=%d test3=%d test4=%d\n",test1,test2,test3,test4);
printf("test1=%c test2=%c test3=%c test4=%c\n",test1,test2,test3,test4);
return 0;
}
|