先上一段代码:
#include <iostream>
using namespace std;
int main()
{
char c;while (c = getchar() != '\n'){
cout << '!';}return 0;
}
运行程序:
我已经输入了很长一段字符,但是getchar()只会读入一个字符,但是按理说只有我们在回车两次的时候才会完成提交,那此时回车会出现什么情况呢?
每次while循环都会有一个!号输出,不对呀按照我们自己的逻辑应该是两次回车,解决这个问题之前我们再看一个经典的情况:
同样的代码我此时输入a字符,我需要再输入几个回车(‘\n’)可以结束输入?
在这段代码里面只需要1个回车就可以,仔细想想不对呀,我们的getchar不是可以录入’\n’的吗?确实可以录入比如这段代码:
char c, d;c = getchar();d = getchar();putchar(c);putchar(d);
我们输入a字符加一个回车结果就直接跳出程序,难道不应该第一个getchar()捕获a第二个getchar()捕获回车然后最后再有一个回车结束输入吗?怎么回事
输出结果为:a加一个回车
我们发现回车确实被捕获了但是并没有按照我们的简单理解思路走,也就是输入两个回车结束输入,是因为:
输入的本身就是’a’’\n’,两个getchar()函数就会读取位于缓冲区这两个字符,’\n’字符会让程序将所有读入的字符输入缓冲区,它是命令,但是它并不会被主动丢弃,实际上你输入ab然后回车,缓冲区会滞留一个’\n’字符,就和输入abcde然后回车一样原理,后者滞留的是’c’‘d’‘e’’\n’四个字符
如果我们输入回车加a呢?回车则正常录入
总结下来就是,如果我们现在有键入回车但是后面还有空余getchar()则程序认为还没有结束,getchar()读取缓冲区的字符不足,但是当键入回车后没有空余的getchar()键入回车(’\n’)一定会让程序结束,至于缓冲区剩余的内容就看你之前键入的多少了。
以上都是本人测试结果,对于c++内部原理理解还不够透彻,如有领悟再来修改。