“按行反向排列”指将多行文本的行序整体翻转,而非每行内字符倒序;需用std::getline逐行读取并缓存至vector,再逆序输出,手动补'\n';大文件可用std::stack替代递归以避免栈溢出;windows换行符\r\n在文本模式下由getline自动处理,无需额外干预。

什么是“按行反向排列”?先明确行为边界
这不是把每行字符串内部字符倒序(如 "abc" → "cba"),而是把多行文本的**行顺序整体翻转**:第1行变最后一行,第2行变倒数第二行……以此类推。比如输入:
hello world cpp
输出应为:
cpp world hello
关键点在于:换行符是分隔符,不是内容;读取必须保留原始行末是否含 \n 的细节,否则可能多空行或丢空行。
用 std::vector<:string></:string> 缓存所有行再倒序遍历
最直观、不易出错的做法:逐行读入,存进容器,最后从后往前打印。
-
std::getline是唯一推荐的逐行读取方式,它自动剥离\n,且能正确处理空行(返回空字符串) - 不要用
operator>>,它会跳过所有空白符,导致空行丢失 - 写入时手动补
\n,因为std::getline已去掉它
示例片段:
std::vector<:string> lines;
std::string line;
while (std::getline(std::cin, line)) {
lines.push_back(line);
}
for (int i = lines.size() - 1; i >= 0; --i) {
std::cout <h3>不缓存全部行?用递归或栈实现流式反向输出</h3>
<p>如果输入极大(GB 级日志),内存受限,就不能全量缓存。此时需借助调用栈或显式 <code>std::stack</code>。</p>
<ul>
<li>递归版本简洁但有栈溢出风险——Linux 默认栈约 8MB,对应约数万行(取决于行长)</li>
<li>
<code>std::stack</code> 更安全,但仍是 O(n) 空间,只是避免了函数调用开销</li>
<li>两者都无法做到真正 O(1) 空间,因为反向输出本质要求记住所有行首位置,而 C++ 标准流不支持反向 seek</li>
</ul>
<p>递归写法(仅作示意,慎用于大文件):</p>
<pre class="brush:php;toolbar:false;">void reverse_print() {
std::string line;
if (std::getline(std::cin, line)) {
reverse_print();
std::cout <h3>Windows 换行符 <code>\r\n</code> 会影响吗?</h3><p>不影响。因为 <code>std::getline</code> 在 text mode 下自动处理:无论输入是 <code>\n</code>(Unix)、<code>\r\n</code>(Windows)还是 <code>\r</code>(旧 Mac),它都只返回不含任何回车符的纯内容,并把换行符“吃掉”。</p>
- 所以你不需要手动 trim
\r - 但如果用二进制模式打开文件(
std::ios::binary),std::getline仍按\n切割,\r会留在字符串末尾——这时才需要检查并移除 - 标准输入/输出默认是 text mode,无需额外处理
真正容易被忽略的是:如果你从文件读取后又用 std::cout 输出到终端,而终端在 Windows 上期望 \r\n,C++ 运行时会自动转换——你完全不用操心。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











