以下所有程序均默认在main函数中运行,省略其他的语句
(1) cin从输入缓冲区读取数据时,会跳过首个有效字符之前的[空格][Tab][换行]这些分隔符。
char a;
cout<<"input:";
cin>>a;
cout<<"char:"<<a <<endl;
末尾的[回车]代表最后的输入结束,下同,不再提示
输入:[空格][Tab][回车]a[回车]
(2) cin读取字符成功后该字符之后的分隔符会残留在输入缓冲区。
介绍一个函数:istream& getline (istream& is, string& str);
Extracts characters from is and stores them into str until the newline character, ‘\n’.
用于捕获[换行]符,并将换行符之前的内容全都保存在str中,并且将’\n’直接从输入缓冲区中删除掉。
char a;
string test;
cin>>a;
getline(cin,test);//不阻塞
cout<<a<<endl;
cout<<"test:"<<test<<endl;
输入:a[回车]
这就是最后的那个[回车]被getline()截获,此时输入缓冲区为空,因此直接输出为空。
输入:a[空格]test[回车]
发现[空格]也被存储在test中,被打印出来。
(3) cin.get()用于获取输入缓冲区的第一个字符,不会忽略任何分隔符。读取成功后该字符之后的数据继续残留在输入缓冲区。
char a,b;
string str;
cout<<"input:";
a=cin.get();
cin.get(b);
getline(cin,str);
cout<<"a:"<<a <<endl;
cout<<"b:"<<b <<endl;
cout<<"str:"<<str <<endl;
输入:a[回车][空格][空格]dd[回车]
发现b多输出了一个空行,这是因为输入的第二个字符[回车]被存入b打印出来,然后再打印最后的endl。剩余的[空格][空格]dd被存入了str打印出来。
(4) 使用cin.get ( char* s, int len )读取一行数据,n为目标空间的大小。
char a;
char p[10]={};
cin.get(p,10);
cin.get(a);
cout<<"a:"<<a <<endl;
cout<<"strlen(p):"<<strlen(p) <<endl;
输入:a[空格]b[空格]c
cin.get遇到回车时结束读取数据,将’\n’之前的内容存入目标空间,不对’\n’做任何处理。之后’\n’被a获取。
(5) 在while()循环中输入数据,ctrl+d只能用于结束接受char类型数据。
vector<char> v;
char c;
cout << "inout:";
while (cin>>c)
v.push_back (c);
cout << "v.size()= " << int(v.size()) << endl;
for(auto & x:v)
cout<<x<<" ";
在遇到int型数据时,ctrl+d并不会起作用。只能通过输入一个非数字的字符来结束输入。因为非数字字符不是int型数据,因此while()判断为false,跳出循环。
vector<int> v;
int c;
cout << "inout:";
while (cin>>c)
v.push_back (c);
cout << "v.size()= " << int(v.size()) << endl;
for(auto & x:v)
cout<<x<<" ";
(6) 在while()循环中连续对两个vector< int >输入数据。在第一个 while(cin>>tmpVal)后使用 cin.clear()来清除flase状态,并用cin.ignore()来忽略这个无效的字符。在第二个 while(cin>>tmpVal)才可以继续接受输入。
vector<int> a;
vector<int> b;
int tmpVal;
cout<<"input A:";
while(cin>>tmpVal)
a.push_back(tmpVal);
cin.clear(); //清除错误状态
cin.ignore(); //跳过无效数据
cout<<"input B:";
while(cin>>tmpVal)
b.push_back(tmpVal);
cin.clear();
cin.ignore();
cout<<"output A:";
for(auto & x:a)
cout<<x<<" ";
cout<<endl;
cout<<"output B:";
for(auto & x:b)
cout<<x<<" ";
cout<<endl;