【C++杂项】cin的详细用法

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[回车]
    在这里插入图片描述
    注意
  1. cin>>从缓冲区中读取数据时,若缓冲区中第一个字符是空格、Tab或回车这些分隔符时,cin>>会将其忽略并清除,继续读取下一个字符,若缓冲区为空,则继续等待。
  2. 如果读取成功,字符后面的分隔符是残留在缓冲区的,cin>>不做处理
  3. 不想略过空白字符,那就使用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.getlinecin.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;
}
  • 18
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值