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

C++如何接收未知行数、每行含两个字符串的输入?

在C++中接收未知行数的输入(每行含两个字符串)

问题描述

需要接收未知行数的输入,每行包含两个以空格分隔的字符串,不确定每行末尾是否存在\n字符。尝试过多种方案均无效,包括:

  • 依赖Ctrl+Z结束输入的逐词读取代码
  • 仅能处理单行输入的getline方案
  • 用-1作为终止符但单行输入会冻结的代码

尝试过的无效代码及问题

  1. 依赖Ctrl+Z的逐词读取:
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector> 
using namespace std;

int main(){
    string line; 
    while(cin>>line and cin.eof()==false){
        cout<<line<<'\n';
    }
    return 0;
}

问题:需手动按Ctrl+Z结束,且无法按行成对处理两个字符串。

  1. 仅读取单行的方案:
#include <iostream>
#include <sstream>
#include <string>
#include <vector>

using namespace std;

int main()
{
    vector<string> words;

    string word;
    string line;

    getline(cin, line);
    istringstream buffer(line);

    while (buffer >> word) words.push_back(word);

    cout << "\nyour words are:\n\n";

    for (unsigned i = 0; i < words.size(); ++i)
        cout << words[i] << endl;
}

问题:只能读取第一行输入,无法处理多行。

  1. 用-1终止的方案:
// 单行输入时会冻结
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector> 
using namespace std;

int main(){
    string line ="-1"; 
    vector<string>data;
    while(1){
        cin>>line;
        if(line.compare("-1")==0) break;
        data.push_back(line);
        line = "-1";
    }
    for(int i =0;i<data.size();i+=2){
        cout<<data[i]<<' '<<data[i+1]<<'\n';
    }
    return 0;
}

问题:单行输入时程序会等待下一个输入,导致冻结。

期望输入示例

cool toolbox
aaa bb
aabaa babbaab

可行解决方案

方案1:直接循环读取成对字符串

利用cin自动跳过空白(空格、换行、制表符等)的特性,直接循环读取两个字符串,直到输入流失效。该方案不依赖每行的\n,只要输入为成对字符串即可。

#include <iostream>
#include <vector>
#include <string>
#include <utility>

using namespace std;

int main() {
    vector<pair<string, string>> input_pairs;
    string str1, str2;
    
    // 循环读取两个字符串,直到输入结束(终端按Ctrl+Z/Ctrl+D或文件结束)
    while (cin >> str1 >> str2) {
        input_pairs.emplace_back(str1, str2);
        // 实时验证读取结果(可选)
        cout << "已读取:" << str1 << " " << str2 << "\n";
    }

    // 输出所有读取到的成对数据
    cout << "\n所有输入对:\n";
    for (const auto& pair : input_pairs) {
        cout << pair.first << " " << pair.second << "\n";
    }

    return 0;
}

特点:

  • 无需关注换行符位置,自动处理任意空白分隔的输入
  • 支持终端手动结束输入或文件重定向输入

方案2:按行读取并解析(严格按行处理)

如果需要确保每行恰好包含两个字符串,可以用getline读取整行,再通过istringstream解析该行内容。该方案兼容每行有无\n的情况。

#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <utility>

using namespace std;

int main() {
    vector<pair<string, string>> input_pairs;
    string line;
    
    // 循环读取每行,直到输入流失效
    while (getline(cin, line)) {
        istringstream line_stream(line);
        string str1, str2;
        // 解析该行的两个字符串
        if (line_stream >> str1 >> str2) {
            input_pairs.emplace_back(str1, str2);
            cout << "已读取行:" << str1 << " " << str2 << "\n";
        } else {
            // 可选:处理格式错误的行
            cout << "警告:该行格式无效,已跳过:" << line << "\n";
        }
    }

    // 输出所有有效输入对
    cout << "\n所有有效输入对:\n";
    for (const auto& pair : input_pairs) {
        cout << pair.first << " " << pair.second << "\n";
    }

    return 0;
}

特点:

  • 严格按行处理,可过滤格式不符合要求的行
  • 自动处理空行(若需跳过空行,可在读取后判断line.empty())

方案3:自定义终止符(避免冻结)

如果需要用自定义终止符(如quit)结束输入,可修改逻辑确保单行输入时不会冻结。

#include <iostream>
#include <vector>
#include <string>
#include <utility>

using namespace std;

int main() {
    vector<pair<string, string>> input_pairs;
    string str1, str2;
    
    while (true) {
        cin >> str1;
        // 检测终止符
        if (str1 == "quit") {
            break;
        }
        // 读取第二个字符串,若读取失败则退出循环
        if (!(cin >> str2)) {
            break;
        }
        input_pairs.emplace_back(str1, str2);
        cout << "已读取:" << str1 << " " << str2 << "\n";
    }

    // 输出所有输入对
    cout << "\n所有输入对:\n";
    for (const auto& pair : input_pairs) {
        cout << pair.first << " " << pair.second << "\n";
    }

    return 0;
}

特点:

  • 输入quit即可立即终止,解决单行输入冻结问题
  • 同时支持输入流自然结束的场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 04:50:23