肖波
博士生导师
硕士生导师
副教授
性别:男
联系方式:xiaobo@bupt.edu.cn
学位:博士学位
在职信息:在职
所在单位:人工智能学院
学历:研究生毕业
所属院系:人工智能学院
办公地点:教三803,教三718
电子邮箱:
邮编:
通讯/办公地址:
邮箱:
同学们初学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>>不做处理。
因此,第一次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