C++如何接收未知行数、每行含两个字符串的输入?
在C++中接收未知行数的输入(每行含两个字符串)
问题描述
需要接收未知行数的输入,每行包含两个以空格分隔的字符串,不确定每行末尾是否存在\n字符。尝试过多种方案均无效,包括:
- 依赖
Ctrl+Z结束输入的逐词读取代码 - 仅能处理单行输入的
getline方案 - 用
-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结束,且无法按行成对处理两个字符串。
- 仅读取单行的方案:
#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终止的方案:
// 单行输入时会冻结 #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
相关产品推荐
相关产品推荐

