此文章是我在自己写代码时,每次结合使用不同的输入方法时,老是遇到各种奇奇怪怪的问题,得不到自己想要的输出结果,查阅了各种资料之后,总结如下:
cin
的读取字符规则:
cin
遇到回车、空格、tab键 结束,但是缓冲区还存在这三个字符,并没有将这三个字符丢弃,且指针光标在这三个字符之前,也就是说,下一次通过其他输入函数读取时,是可以读到这三个字符的。
cin.get
的读取字符规则:
- 读取字符:
以回车键结束,并且会将回车键作为一个字符读入,读完回车键之后,指针光标移到回车键后面,如果后面还有输入的话,会读取下一字符。故下图不会像后面读取字符串一样介绍的不跳过回车键
int main()
{
int len=0;
cin>>len;
int j=0;
// cin.ignore();
while(len)
{
cout<<"len:"<<len<<endl;
char str[100];
cin.get(str[j]);
// cin.ignore();
cout<<"str:"<<int(str[j])<<'\t';
j++;
len--;
}
return 0;
}
如下所示,使用
cin.ignore
将回车符丢弃,程序便能够正常运行。
- 读取字符串:
以回车键结束,读取到前面残留的回车会直接结束,并且指针光标不会跳过回车键,当输入
3【回车】
之后,再次使用cin.get
,然后想输入4【回车】
是读取不到该输入值的但是你不用输入,程序会直接结束,因为前一个输入的回车并没有舍弃,而是在缓冲区,这时读取到的是缓冲区的回车而直接结束。
以下是不使用cin.ignore
丢弃缓冲区的字符的结果:
指针光标不跳过回车键:注释掉
cin.ignore
之后,可以看到程序只输入5【回车】
,就直接结束了,而且输入了5个空串,后面的输入语句看似没有执行,其实执行了,读取的是缓冲区中遗留下的回车键,并且cin.get
函数遇到回车不会将指针光标移到回车后,故造成了读到的一直是回车,所以结束
cin.getline
和cin.get
函数类似,所不同的是,cin.getline
遇到回车会将指针光标后移,具体看后面cin.getline
的贴图。(
cin.ignore
的作用默认是丢弃缓冲区的一个字符)。
我们可以看到
cin>>len
之后,回车了,而且后面也有cin.get
要求输入,但是程序却直接自动执行结束,说明读取字符串时,指针光标不会跳过回车键,除非人为添加cin.ignore()
或者getchar()
读走回车键,程序才能正常运行.
int main()
{
int len=0;
cin>>len;
int j=0;
// cin.ignore();
while(len)
{
cout<<"len:"<<len<<endl;
char str[100];
cin.get(str,100);
// cin.ignore();
cout<<"str:"<<str<<'\t';
j++;
len--;
}
return 0;
}
如下所示,使用
cin.ignore
将回车符丢弃,程序便能够正常运行。
cin.getline
的读取字符规则:
- 读取字符串:回车键结束
当读到回车键的时候,此次读取结束,会将指针光标移到回车键之后,从而下一次读取的是回车键之后的字符。
int main()
{
int len=0;
cin>>len;
int j=0;
cin.ignore();
while(len)
{
cout<<"len:"<<len<<endl;
char str[100];
cin.getline(str,100);
// cin.ignore();
cout<<"str:"<<str<<'\t';
j++;
len--;
}
return 0;
}
当我们输入
2【回车】
后,使用cin.ignore
丢弃了回车符,所以再输入12【回车】
时,直接读取12,指针光标移到回车之后,而第二次读取时,读取的是我们输入的23,而不是12的回车键。
如果我们注释掉第一个
cin.ignore
之后,可以看到,我们输入2【回车】
后,len
读取了2,然后cin.getline
遇到前面缓冲区留下的回车键,结束此次读取操作,并将指针光标移动至回车之后,然后执行下一次读取操作,我们输入23,可以看到第二次读取到了23这个字符串。