cin详细用法
- 1. cin简介
- 2. cin的常用读取方法
- 2.1 `cin>>`的用法
- 2.2 `cin.get`的用法
- 2.3 `cin.getline`的用法
- 3. `cin`清空输入缓冲区
- 4. 其它方法
- 4.1 getline()读取一行
1. cin简介
cin是C++中的标准输入流对象,即istream类的对象。cin主要用于从标准输入读取数据,标准输入指的是终端输入。此外cout是C++中的标准输出流对象,即ostream类对象,cerr是标准错误输出流对象,也是ostream类对象。
当我们从键盘输入字符串的时候,需要敲击回车才能将这个字符串送入到缓冲区中,敲入的这个回车会被转换成一个换行符\n
,这个换行符也会被存储在cin的缓冲区中并且被当成一个字符来计算。例如输入123456789
,然后再敲回车将字符串输入缓冲区,那么此时缓冲区的字节数是10
而不是9.
cin读取数据时也是从缓冲区获取数据,当缓冲区为空时,cin的成员函数会阻塞等待数据的到来,一旦缓冲区中有数据,就触发cin的成员函数去读取数据。
2. cin的常用读取方法
使用cin从标准输入读取数据时,通常用到的方法有cin>>
,cin.get()
,cin.getline()
2.1 cin>>
的用法
cin可以连续从标准输入读取数据,以空格、tab或换行符作为一次读取的分隔符。
代码示例:
//1. cin>>
string a, b;
cin >> a;
cin >> b;
cout <<"a:"<< a << "\nb:" << b << endl;
- 输入aaa[空格]bbb[回车]
- 输入aaa[Tab]bbb[回车]
*输入aaa[回车]bbb[回车]
注意:
- 当
cin>>
从缓冲区中读取数据时,若缓冲区中第一个字符是空格、Tab或回车这些分隔符时,cin>>
会将其忽略并清除,继续读取下一个字符,若缓冲区为空,则继续等待。 - 如果读取成功,字符后面的分隔符是残留在缓冲区的,
cin>>
不做处理。 - 不想略过空白字符,那就使用
noskipws
流控制。比如cin>>noskipws>>input;
2.2 cin.get
的用法
该函数有多种重载形式,分为四种:无参数、一个参数、两个参数和三个参数。常用的函数原型如下所示:
int cin.get(); // 读取一个字符,不会跳过分隔符。读取成功:返回读取字符的ASCII码,遇到文件结束符时,返回EOF,即-1
istream& cin.get(char& var); // 读取一个字符,并赋值给var,不会跳过分隔符。读取成功:返回的是cin对象,因此可以支持链式操作,如 `cin.get(a).get(b)`
istream& get ( char* s, streamsize n);// 读取一行,默认以换行符结束,n表示目标空间的大小
istream& get (char* s, streamsize n, char delim);// 读取一行,以指定的delim作为一行的结束符,n表示目标空间的大小
代码示例:
- 读取一个字符:输入a[回车]
int a = cin.get();int b = cin.get();cout << "a:" << a<<"\nb:"<<b << endl;
可以看到第一次读取,读入了字符a,并返回了ascii码。第二次读取时,直接将缓冲区残余的回车(\n
,换行符)读入。
- 读取一行:输入abcd[回车]
char buf[100];
cin.get(buf, 100);
for (int i = 0; i < 5; i++) // 假设输入5个字符
{cout << "i" << i << "=" << (int)buf[i] << endl;
}
cout << endl;
int b = cin.get();
cout <<"b:"<<b << endl;
可以看到这种方法读取了[回车]前的所有字符,并存入了buf,但是最后的[回车]符残留在了缓冲区中,下次利用get读取读入了[回车]
- 以指定字符结束读取入一行:输入abcdef[回车]
char buf[100];
cin.get(buf, 100,'f');// 以f作为结束符
for (int i = 0; i < 5; i++) // 假设输入6个字符abcdef
{cout << "i" << i << "=" << (int)buf[i] << endl;
}int b = cin.get(); // 读取残余的f
cout <<"b:"<<b << endl;int c = cin.get(); // 读取残余的回车
cout << "c:" << c << endl;
可以看到这种方法读取了字符[f]前的所有字符,并存入了buf,但是最后的残余的[f]和[回车]残留在了缓冲区中,下次利用get读取读入了[f],最后一次读取读入了[回车]
2.3 cin.getline
的用法
函数作用:从标准输入上读取一串字符串,并以指定的结束符结束
函数原型有两个
istream& getline(char*s, streamsize count); // 默认以换行符结束
istream& getline(char*s, streamsize count,char delim);// 以指定结束符结束
注意
cin.getline
与cin.get
的区别是:cin.getline
不会将结束符或者换行符残留在输入缓冲区中。
3. cin
清空输入缓冲区
清空输入缓冲区应该使用cin.ignore()
函数原型:istream& ignore(streamsize num=1,int delim=EOF)
函数作用:跳过输入流中的num个字符,或者遇到指定的终止字符时提前结束(此时跳过包括终止字符在内的若干个字符)。
4. 其它方法
4.1 getline()读取一行
c++中定义了一个在std命名空间中的全局函数getline()
,这个函数使用到了string
字符串。
getline利用cin可以从标准输入读取一行,当遇到三种情况下会结束读取操作:1. 到文件结束 2. 到指定的符号 3. 输入达到最大限度
函数原型:
istream& getline(istream& is,string & str); // 从is读取一行到string中,默认以换行符结束
istream& getline(istream& is,string & str,char delim); // 从is读取一行到string中,以delim指定的符号结束
代码示例:
string s;
getline(cin, s); // 默认字符结束
// getline(cin,s,'\n'); // 指定字符结束
cout <<"s:"<< s << endl;
利用这个getline和stringstream可以实现字符串的拆分
实现
string str;
string str_cin;
getline(cin,str_cin); // 从cin读入一行,假设是ab.cd.ef
// 将字符串转换成stringstream
stringstream ss;
ss<<str_cin;
while(getline(ss,str,'.') // 将ab.cd.ef按照'.'拆分
{cout<<str<<endl;
}