如何实现输入文本反转输出并按指定长度换行?
解决文本反转并按指定宽度换行的问题
首先分析你的原代码存在的核心问题:
- 变量
i未初始化,初始值为随机值,导致读取输入时写入input数组的错误位置,引发越界或逻辑混乱。 - 使用
scanf("%c")读取文本时,未处理scanf("%d")遗留的换行符,导致输入数组开头包含多余的空字符。 - 反转逻辑完全错误,索引计算混乱(如
mirror[k] = input[reset - k]),且输出时误用了数组索引i而非k。 - 块索引更新逻辑(
reset = (j * reset))错误,会导致数组越界。 - 未处理文本长度不足指定行宽时的空格填充。
正确实现思路(匹配示例输出)
根据你的示例,需求是:将原文本按指定行宽从后往前分块,每个块反转后右对齐(不足行宽时前面补空格),按顺序输出。以下是实现代码:
#include <stdio.h> #include <string.h> int main() { char input[121]; int line_width, len, rows, i, j; // 读取行宽并清除缓冲区换行 printf("Enter the length of the output line: "); scanf("%d", &line_width); getchar(); // 读取输入文本直到EOF printf("Enter your text (control-d to exit): "); len = 0; while ((input[len] = getchar()) != EOF && len < 120) { len++; } input[len] = '\0'; // 计算总行数(向上取整) rows = (len + line_width - 1) / line_width; printf("output:\n"); for (i = 0; i < rows; i++) { // 计算当前块的起始和结束索引 int block_start = len - (i + 1) * line_width; int block_end = len - i * line_width; // 输出前面的填充空格 for (j = 0; j < (block_start < 0 ? -block_start : 0); j++) { printf(" "); } // 输出反转后的块内容 int start_idx = block_start > 0 ? block_start : 0; for (j = block_end - 1; j >= start_idx; j--) { printf("%c", input[j]); } printf("\n"); } // 输出位置标记 for (i = 1; i <= line_width; i++) { printf("%d", i); } printf("\n"); return 0; }
代码说明
- 输入处理:用
getchar()清除scanf("%d")后的换行符,避免干扰文本读取;逐字符读取文本直到EOF,确保完整获取输入。 - 行数计算:通过
(len + line_width - 1) / line_width实现向上取整,得到需要的总行数。 - 逐行输出:
- 从原文本末尾往前划分块,确保输出顺序匹配示例。
- 若块起始索引为负,说明当前块长度不足行宽,输出对应数量的填充空格。
- 反向遍历当前块的字符,实现块内反转并输出。
测试验证
输入示例中的内容:
Enter the length of the output line: 5 Enter your text (control-d to exit): Hello there
输出将与示例完全一致:
output: olleH ereh t 12345
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

