缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区。
首先你要知道对于计算机而言,在取输入的数据的时候是有个缓冲区的,用于将用户读入的素具进行存储,实际上就是一个队列对你的第一个问题:
int ch1=getchar()
int ch2=getchar()
int ch3=getchar()
在你输入9回车6回车,那么此时缓冲区的字符数据为入 9回车6回车(实际上计算机认为你输入的是字符9和6,因为getchar是针对字符的,由于你定义的是int型,因此计算机会自动转换为它的ASC码,也就是一个整数,再你输出的时候又是以字符串的形式输出的,计算机又将这个整数(也就是当时的ASC码)转换为字符,这两个转化不用你管,计算机有这个功能称为自动转化),由于getchar是取的单个字符,因此它只取走了前三个字符9 回车 6 最后还有一个回车符停留在缓冲区,那么在用户下一次输入的时候计算机就首先会从回车符开始
在你输入9空格6空格3回车,情况和上面一样,只是缓冲区里面存放的是 空格 3 回车了,前面的三个都被取走了,那么在用户下一次输入的时候计算机就首先会从空格开始
对你的第二个问题:
你的想法很美好,但是你忽略了一个事实,
while ((c = getchar()) != '\n')
printf("%c", c)
while循环一定会执行一条语句,而且直到遇到第一个语句块(一般为遇到一个分号,但是if-else除外,因为if-else对计算机而言是一个整体,也就是一个语句块),也就是说当你输入 字符c 回车符的时候,缓冲区里存放的是 c 回车符 ,但是此时计算机会逐个检查你的输入,首先检查c 它不是回车符就printf("%c", c)将c打印出来,然后发现后面还有字符回车,检查一下不符合要求就退出循环,不执行下面的printf("%c", c)(此时的变量c为回车符),因此组后显示的就是一个字符c,关于中间的两次转换和第一个问题的回答是一样的
还有什么不懂的可以继续交流~~~
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)