访问量:   最后更新时间:--

肖波

博士生导师

硕士生导师

副教授

性别:男

联系方式:xiaobo@bupt.edu.cn

学位:博士学位

在职信息:在职

所在单位:人工智能学院

学历:研究生毕业

所属院系:人工智能学院

办公地点:教三803,教三718

电子邮箱:

其他联系方式

暂无内容

教师博客
当前位置: 中文主页 > 教师博客
c++中的cin使用注意事项
发布时间:2020-12-29  点击次数:

同学们初学c++,cin用的非常多,但由于很多细节不清楚,也非常容易出错。例如如下要求:

编写程序,首先输入数字n,表示后续输入n行字符串,然后输出每次输入的字符串。

看似简单,很多同学很快就可以编写完成:

#include<iostream>

using namespace std;

int main()

{

int n;

char s[100];

cin >> n;

for (int i = 0; i < n; i++)

{

cin.getline(s, 100);

cout << s << endl;

}

return 0;

}

但实际上,这个程序执行是错误的。

例如开始输入为1,则程序打印空行后直接退出,为什么呢?

这是因为在使用cin时,需要注意:

(1)cin>>等价于cin.operator>>(),即调用成员函数operator>>()进行读取数据。 
(2)当cin>>从缓冲区中读取数据时,若缓冲区中第一个字符是空格、tab或换行这些分隔符时,cin>>会将其忽略并清除,继续读取下一个字符,若缓冲区为空,则继续等待。但是如果读取成功,字符后面的分隔符是残留在缓冲区的,cin>>不做处理。 

(3)不想略过空白字符,那就使用 noskipws 流控制。比如cin>>noskipws>>input;

因此,第一次getline时,缓冲区中有输入数字时的回车,直接将空串放到了s中,因此逻辑全部出错了。

解决方法:

cin.ignore(10, ‘\n’);

表示忽略缓冲区最多前10个字符,或者直到遇到\n为止。代码改为

#include<iostream>

using namespace std;

int main()

{

int n;

char s[100];

cin >> n;

cin.ignore(10, '\n');

for (int i = 0; i < n; i++)

{

cin.getline(s, 100);

cout << s << endl;

}

return 0;

}

问题解决。

网上也有各种其他做法,在此不鼓励采纳,例如使用cin.sync()函数,因为有的编译器不支持,或不同平台有一定差异。


若题目改为:

编写程序,连续输入n行字符串,然后输出每次输入的字符串。

既然没有告诉到底输入多少行,则相当于按Ctrl+d(Linux)或Ctrl+z(Windows)结束输入了。

代码如下:

#include<iostream>

using namespace std;

int main()

{

char s[100];

while(cin.getline(s, 100)){

cout << s << endl;

}

return 0;

}


对于数字输入,类同:

int a;
while (cin >> a)

{...}


无论在什么平台或编译器下,以上代码基本都可以正确执行。

尤其在OJ系统中,这些方法都是常用的,希望大家使用OJ系统时,不要在问题的输入上浪费时间。

我们自己研发的的OJ系统:http://10.33.32.3/Homework