You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++读取n个含空格字符串存入vector异常问题求助

问题分析与解决

你的代码出现问题的核心原因是:用cin >> n读取整数后,输入缓冲区里会残留一个换行符。后续执行第一个getline(cin, s)时,会直接读取这个换行符,存入一个空字符串,导致后续循环只能读取到n-1个有效字符串,输出时自然先打印空行,再输出剩下的内容。

解决办法有两种常见方式:

  • 方式一:忽略缓冲区残留的换行符
    在cin >> n之后,调用cin.ignore()清除缓冲区里的换行符。如果输入n后可能存在多个空白字符(比如空格+换行),建议用cin.ignore(numeric_limits<streamsize>::max(), '\n'),确保忽略掉换行前的所有空白内容。

    修正后的代码:

    #include <bits/stdc++.h>
    using namespace std;
    int main()
    {
        int n;
        cin >> n;
        // 清除输入n后残留的所有空白直到换行
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
        vector<string> v;
        for (int i = 0; i < n; i++)
        {
            string s;
            getline(cin, s);
            v.push_back(s);
        }
        // 用范围for循环遍历输出更简洁
        for (const auto& str : v) {
            cout << str << endl;
        }
    }
    
  • 方式二:统一用getline读取输入
    先读取包含n的整行字符串,再将其转换为整数,这样就不会留下残留的换行符干扰后续的getline调用。

    修正后的代码:

    #include <bits/stdc++.h>
    using namespace std;
    int main()
    {
        string n_str;
        getline(cin, n_str);
        int n = stoi(n_str);
        vector<string> v;
        for (int i = 0; i < n; i++)
        {
            string s;
            getline(cin, s);
            v.push_back(s);
        }
        for (const auto& str : v) {
            cout << str << endl;
        }
    }
    

内容的提问来源于stack exchange,提问作者user22643044

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 02:01:01