按行分割后对每行做字符反转,需先用换行符切分字符串再逐行调用std::reverse;切分时用find+substr避免getline边界问题;拼接时行间加'\n'但末尾不额外添加;空串、空行、"\n"等边界均需正确处理。

按行分割后对每行做字符反转
核心是先用换行符切分原始字符串,再对每行单独调用 std::reverse。注意不能直接对整个字符串反转,否则行间顺序也会颠倒(比如第3行跑到第1行位置)。
常见错误是用 std::getline 读取时忽略了最后一行无换行符的边界情况,或手动找 '\n' 时没处理 "\r\n"(Windows 换行)。推荐统一用 std::string::find 配合 substr 切分:
std::vector<:string> lines;
size_t start = 0;
while (start <ul>
<li>每次 <code>substr</code> 取 <code>[start, end)</code>,跳过 <code>'\n'</code> 本身</li>
<li>
<code>end == npos</code> 时说明是最后一行,直接取到末尾</li>
<li>不依赖 <code>std::getline</code>,避免流状态干扰后续操作</li>
</ul>
<h3>反转每行字符并保持行序不变</h3>
<p>切分后逐行反转即可,用 <code>std::reverse</code> 最安全:</p>
<pre class="brush:php;toolbar:false;">for (auto& line : lines) {
std::reverse(line.begin(), line.end());
}
别手写循环交换——容易下标越界或漏掉中间字符;也别用 std::string(line.rbegin(), line.rend()) 构造新串,虽等价但多一次内存分配。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
-
std::reverse是就地操作,O(n) 时间、O(1) 额外空间 - 若原字符串含空行(
""),reverse仍安全,不崩溃也不报错 - UTF-8 字符串慎用:该方法反转的是字节,不是 Unicode 码点,中文/emoji 会乱码
合并结果时换行符怎么加
拼回字符串时,行之间要补 '\n',但末尾**不能多加一个换行**,否则输出比原串多一行空行。
最简方案是用标志位控制分隔符:
std::string result;
bool first = true;
for (const auto& line : lines) {
if (!first) result += '\n';
result += line;
first = false;
}
- 不用
join类函数(C++20std::format或第三方库才支持),避免引入依赖 - 如果确定输入以
'\n'结尾,且要求输出也必须结尾有换行,则最后补result += '\n'; - 直接
+=字符串比append更常用,编译器优化足够好
完整函数封装及边界处理
把上面三步包成函数时,最容易被忽略的是空字符串和全换行字符串(如 "\n\n"):
std::string reverse_lines(const std::string& s) {
if (s.empty()) return s;
// ...切分、反转、拼接...
return result;
}
- 输入为
"\n"时,应产出"\n"(两行:空行 + 空行 → 反转后仍是两个空行) - 输入为
"a\nb"→ 输出"a\nb"(单字符行反转后不变) - 若需兼容
\r\n,替换预处理:std::regex_replace(s, std::regex("\r\n"), "\n"),但正则开销大,仅当明确需要时加
真正难的不是反转逻辑,而是切分时对换行符的定义是否和你的使用场景一致——比如日志解析通常要保留原始换行风格,而配置文件处理可能强制标准化。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










