C++中如何读取到终止字符@为止的多段可分隔句子输入
C++读取带编号句子直到@终止的实现方案
核心逻辑
输入的分隔符可以是空格或换行,因此必须采用逐字符读取的方式覆盖所有输入场景,遇到终止符@时直接结束读取即可。如果需要拆分单条句子,可以通过带编号句子的固定格式(如数字.开头)做分割判断。
最简实现(先读取全部有效内容再处理)
如果你不需要读取时就拆分句子,可以直接把所有@之前的内容全部读入内存,后续再做拆分处理:
#include <iostream> #include <string> int main() { std::string input_content; char ch; // 逐字符读取所有内容,直到遇到@或输入结束 while (std::cin.get(ch) && ch != '@') { input_content += ch; } // 后续可自行对input_content做句子拆分逻辑 return 0; }
注意:这里必须使用std::cin.get()读取字符,不能用std::cin >> ch,后者会默认跳过空格、换行等空白符,会丢失输入中的分隔符信息。
读取时直接拆分句子的实现
如果需要在读取阶段就拆分出单条带编号的句子,可以通过匹配句子开头的数字.格式实现,自动忽略句子之间的空格、换行分隔符:
#include <iostream> #include <vector> #include <string> #include <cctype> int main() { std::vector<std::string> sentences; std::string current_sentence; char ch; while (std::cin.get(ch)) { // 遇到终止符直接结束,保存最后一句未存入的内容 if (ch == '@') { if (!current_sentence.empty()) { sentences.push_back(current_sentence); } break; } // 匹配新句子的开头:数字 + . 的格式 if (std::isdigit(ch) && !current_sentence.empty()) { char next_ch; if (std::cin.get(next_ch)) { if (next_ch == '.') { // 确认是新句子开头,保存上一句 sentences.push_back(current_sentence); current_sentence.clear(); // 把预读的两个字符退回输入流,重新读取 std::cin.unget(); std::cin.unget(); continue; } // 不是句子开头,退回预读字符 std::cin.unget(); } } current_sentence += ch; } // 测试输出读取到的句子 for (size_t i = 0; i < sentences.size(); i++) { std::cout << "句子" << i + 1 << ": " << sentences[i] << std::endl; } return 0; }
适用场景说明
- 上述实现兼容空格、换行作为分隔符的输入格式
- 支持多位数的句子编号(如
12. xxx也可正常识别) - 句子内部的空格、换行可以正常保留,不会被误删
内容的提问来源于stack exchange,提问作者sirac emin topçu
相关产品推荐
相关产品推荐

