1. 背景
学习C++,cin是无可避免的,现对cin进行一些小结。
2. 小结
- cin是istream对象,用来从标准输入读取数据。具体过程:键盘输入数据->数据保存至缓冲区->cin从缓冲区读取数据。
- cin.sync()用于清空缓冲区。
- cin.clear()用于修改cin状态标识符。
3. 示例
3.1 一次cin
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s1, s2;
cin >> s1;
cout << s1 << endl;
return 0;
}
说明:当输入" 12 34"换行时,cin忽略开头的空白(空格符、换行符、制表符等),从有效数据开始读取,即从"1"开始,遇到下一处空白便会结束读取,即只读到"2"。cin不算正常结束,因为缓冲区中还保留数据:"34"和换行符。
3.2 两次cin
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s1, s2;
cin >> s1;
cout << s1 << endl;
cout << "----------------------------" << endl;
cin >> s2;
cout << s2 << endl;
return 0;
}
说明:
1. 当输入" 12 34"换行时,程序直接输出"12"和"34",不会让人继续输入s2。其原因是输入s1时,cin已经将"12"读取,但缓冲区中还留有"34"和换行符。当下次输入时,cin已经默认读取"34",遇换行符结束。
2. 正确输入方式应该是先输入"12"换行,再输入"34"换行。换行可使cin正常结束读取数据。
3. 插入cin.sync()清空缓冲区数据,也能正确实现两次输入。因为第1个cin读完"12"后,缓冲区被清空。第2个cin从缓冲区读数据时,数据为空,需重新输入。
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s1, s2;
cin >> s1;
cout << s1 << endl;
cin.sync(); //清空缓冲区数据
cout << "----------------------------" << endl;
cin >> s2;
cout << s2 << endl;
return 0;
}
3.3 文件结束符(Ctrl+Z)后cin
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s1, s2, s3;
while (cin >> s1)//对输入的字符串进行连接
{
s2 += s1;
}
cout << s2 << endl;
cout << "------------------------" << endl;
cin >> s3;
cout << s3 << endl;
return 0;
}
说明:循环用cin输入,然后用Ctrl+Z退出循环,发现后面的cin不起作用。其原因是Ctrl+Z已使cin失效。可用cin.clear()修改cin状态标识符,使cin重新可用。
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s1, s2, s3;
while (cin >> s1)//对输入的字符串进行连接
{
s2 += s1;
}
cout << s2 << endl;
cin.clear(); //修改cin状态标识符
cout << "------------------------" << endl;
getline(cin, s1);
for (unsigned int i = 0; i < s1.size(); i++)
{
if (s1[i] != ' ')
{
s3 += s1[i];
}
}
cout << s3 << endl;
return 0;
}