在你输入y回车后,键盘的缓冲区中会存在一个y和一个'\n'(回车符)。所以第第一次你的a会读入字符y,然而第二次输入y时,缓冲区中还有一个回车符在,所以第二次读入的是第一次残留在缓冲区的回车符,而不是新输入的y。所以不满足条件,退出循环。
修改方法:
在scanf语句前加一句:fflush(stdin);这句的作用是清空缓冲区(就是所谓的流)中内容,这样你再次输入y的时候就不会读到上次剩余的回车符了。
三点:
1.
scanf从缓冲区读取:你输入的字符串会保存在一个缓冲区内,scanf在正确的时候是到这个缓冲区中读取字符,并且从缓冲区中删除字符。但如果是%d格式碰到了字母,则不会读取也不会删除,之后abc还在缓冲区内。
2.
scanf不停止:如果缓冲区内有内容,scanf是不会停下来等你输入的,因为abc一直在缓冲区内,所以造成了一直不停重复循环。
3.
scanf的返回值:scanf如果成功返回的是输入的个数,当你输入abc的时候,scanf失败,返回0,则条件一直成立,所以造成了死循环