“按行反向排列”指将多行文本的行序整体翻转,而非每行内字符倒序;需用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> 缓存所有行再倒序遍历
最直观、不易出错的做法:逐行读入,存进容器,最后从后往前打印。
立即学习“C++免费学习笔记(深入)”;
-
std::getline是唯一推荐的逐行读取方式,它自动剥离\n,且能正确处理空行(返回空字符串) - 不要用
operator>>,它会跳过所有空白符,导致空行丢失 - 写入时手动补
\n,因为std::getline已去掉它
示例片段:
std::vector<std::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 << lines[i] << '\n';
}不缓存全部行?用递归或栈实现流式反向输出
如果输入极大(GB 级日志),内存受限,就不能全量缓存。此时需借助调用栈或显式 std::stack。
- 递归版本简洁但有栈溢出风险——Linux 默认栈约 8MB,对应约数万行(取决于行长)
-
std::stack更安全,但仍是 O(n) 空间,只是避免了函数调用开销 - 两者都无法做到真正 O(1) 空间,因为反向输出本质要求记住所有行首位置,而 C++ 标准流不支持反向 seek
递归写法(仅作示意,慎用于大文件):
void reverse_print() {
std::string line;
if (std::getline(std::cin, line)) {
reverse_print();
std::cout << line << '\n';
}
}Windows 换行符 \r\n 会影响吗?
不影响。因为 std::getline 在 text mode 下自动处理:无论输入是 \n(Unix)、\r\n(Windows)还是 \r(旧 Mac),它都只返回不含任何回车符的纯内容,并把换行符“吃掉”。
- 所以你不需要手动 trim
\r - 但如果用二进制模式打开文件(
std::ios::binary),std::getline仍按\n切割,\r会留在字符串末尾——这时才需要检查并移除 - 标准输入/输出默认是 text mode,无需额外处理
真正容易被忽略的是:如果你从文件读取后又用 std::cout 输出到终端,而终端在 Windows 上期望 \r\n,C++ 运行时会自动转换——你完全不用操心。


















