带新生写 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 九成场景。