“按行反转输出”指两种操作:一是反转每行字符顺序(如"abc"→"cba"),二是反转所有行的输出顺序(末行优先)。需明确需求,用vector逐行读取再倒序遍历,避免getline误处理换行符或空行。

组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
什么是“按行反转输出”?先确认需求边界
很多人看到“按行反转”第一反应是把每行字符倒序,比如 "abc" 变成 "cba";但实际中常混淆成“行顺序反转”,即最后一行最先输出。C++ 没有内置函数直接做这个,必须自己拆行、存行、再决定反转粒度——所以第一步得明确:你到底想反转每行内部字符,还是反转所有行的顺序?
常见错误现象:std::getline 读完后直接用 std::reverse 对整段字符串操作,结果把换行符也翻进去了,输出错乱。
使用场景分两种:
- 日志/配置文件逐行处理,需逆序打印(行顺序反转)
- 密码或编码类任务,要求每行内容镜像(字符级反转)
按行读取并反转行顺序:用 vector 存,再倒着遍历
核心是别用 std::string 一股脑读整个文件,而是用 std::vector<:string></:string> 缓存每一行,最后从后往前输出。
实操建议:
- 用
std::getline逐行读入,避免operator>>跳过空白导致换行丢失 - 注意空行:
std::getline会保留空字符串,这是正确行为,别用if (line.empty()) continue过滤 - 如果输入来自文件,记得检查
std::ifstream::fail(),否则最后一行可能漏读
std::vector<:string> lines;
std::string line;
while (std::getline(std::cin, line)) {
lines.push_back(line);
}
for (auto it = lines.rbegin(); it != lines.rend(); ++it) {
std::cout
<h3>对每行内部字符反转:用 std::reverse 配合迭代器
这里容易踩坑的是作用域和副作用:<code>std::reverse</code> 修改原字符串,如果你后续还要用原始行,就得先拷贝。
</h3>
<p>参数差异要注意:
</p>
<ul>
<li>
<code>std::reverse(line.begin(), line.end())</code> —— 反转整行(含空格,不含换行符,因为 <code>std::getline</code> 已剥离)</li>
<li>如果用了 <code>std::cin >> line</code>,它会停在空格,根本读不全一行,绝对不用</li>
<li>Windows 文件换行是 <code>"\r\n"</code>,但 <code>std::getline</code> 自动吃掉 <code>\r</code>(在 text mode 下),无需额外处理</li>
</ul>
<pre class="brush:php;toolbar:false;">
std::string line;
while (std::getline(std::cin, line)) {
std::reverse(line.begin(), line.end());
std::cout
<h3>性能与边界情况:大文件、超长行、宽字符怎么办
<code>std::vector</code> 存所有行在内存里,10MB 日志文件可能占 20MB+(每行额外分配开销),这时就得流式处理:只缓存当前行,边读边反——但仅适用于“每行反转”,不适用于“行顺序反转”。
</h3><p>容易被忽略的点:
</p>
- UTF-8 字符串不能直接用
std::reverse,会破坏多字节序列,得用 ICU 或手动解析码点 - 输入为空时,
while (std::getline(...))不进循环,输出为空——符合预期,但测试时别忘了空输入用例 - Linux 下管道输入(如
cat file.txt | ./a.out),EOF 触发方式和终端 Ctrl+D 一致,没问题
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










