带新生写 OJ,第一题输入两个整数求和,他写了 scanf,我说你学 C++ 就用 cin。他敲了 cin >> a >> b,样例过了,提交却在多组输入上挂了,问题出在没处理输入结束。
最基本的连读
cin 后面跟 >> 就能连续读,空格、回车、Tab 都当分隔符自动跳过:
int a, b;
cin >> a >> b;
cout << a + b;读字符串时要注意,cin >> s 碰到空格就停,想读一整行带空格的,得用 getline(cin, s)。混用两者时,前面 >> 留下的换行符会被 getline 当成空行读进去,先用 cin.ignore() 吃掉它。
多组输入怎么写循环
题目说输入到文件结束,就把 cin 放进 while 条件:
int a, b;
while (cin >> a >> b) {
cout << a + b << endl;
}读到文件尾 cin 会变成假,循环自动停。本地调试时 Windows 按 Ctrl+Z 再回车模拟结束,Linux 按 Ctrl+D。
输入对不上的排查
- 输字母给 int:流进入失败状态,后面全读不到,先清状态再忽略坏字符
- 大数据超时:关掉同步,加一句能快不少,但之后别混用 C 的输入输出
- 浮点精度:读 double 没问题,输出要控制小数位用 fixed 配 setprecision
- 读整行:优先 getline,空行多就加判断跳过
cin.sync_with_stdio(false);
cin.tie(nullptr);这两句是提速标配,放 main 开头,比赛和大数据输入必备。
一句话:写算法题就记住 while 循环读、混读先 ignore、大数据先关同步,这三招 cover 九成场景。