明白能过滤首字符后的所有字符,但还是不解,为何能过滤掉\n
比如输入了abcd然后按下回车,刷新缓冲区,此时判断a!=y,然后打印请按y。然后进入第2个while,只要不是\n,就跳过。此时过滤掉了bcd。然后发现是\n了,为什么不能再回到第一个while中再打印请按y呢?
\n到底是在什么位置过滤掉的?
"然后进入第2个while,只要不是\n,就跳过"
事实上 这个时候 就算是\n 这个字符是不是也被getchar取出来了?
因为判断是否为\n的前提就是要把输入缓冲区内的\n取出来
跳出第二个循环,\n就已经被过滤了
你的意思这个\n实际是被消耗掉了?
那如果把while (getchar() != '\n')改成while (getchar() != 's')
为什么输入ss的时候会打印2遍 请按y?
按说判断第1个s不是y,并打印。第2个s被消耗掉,最后一个\n被跳过啊
你要知道 getchar 你自己输入的内容 是用回车结束的
所以实际键盘缓冲区最后会多一个\n
你输入ss 实际缓冲区里是三个字符 s s 和\n
第一个字符用于判断 于是失败了 打印出 请按y
第二个字符被用于内层循环的判断 ,由于判断成功,第二层循环跳出,但是这个s仍然被消耗掉
第三个字符\n用于是否是y的判断 ,失败 所以又打引出 请按y
我们再看原来那个题 你输入s回车
第一个s用于判断 ,失败并打印请按y
第二个回车就被内层循环消耗掉,再次回到外层循环并等待输入
你说的这3步过程不对,通过vs的逐语句观察发现
输入ss按下回车后,判断第1个s不是y,打印 请按y
进入第2个while,判断不是s跳过,并且回到第1个循环中,再判断第2个s不是y,又打印一次,所以打印了2个
然后进入第2个while,并不判断\n,而是要求输入
此时输入d并按下回车,进行跳过,然后跳过\n(d后面的\n)。
并且不会回到第一个while中,而是一直循环在第2个while。
我便更无法理解
我说得没错
你把程序改下就知道了
#include<stdio.h>上面是我理解错了。我说\n为什么无故消失了,实际上s是被消耗了,第二打印是\n输出的
我再整理下思路,没问题就采纳了,关于这个要是不懂,再问啊,先谢了