C语言自定义行反转函数结果不稳定,求技术分析解决
问题分析与修复方案
核心问题点
- 字符串未终止:main函数读取行字符后,没有给
line数组添加字符串终止符'\0'。reverse函数依赖theline[i] != 0判断字符串结束,而未初始化的数组剩余位置是随机垃圾值,导致循环读取越界,这是运行结果不稳定的根本原因。 - 反转循环逻辑错误:
- 第一个循环结束后,
i的值是原字符串的长度(比如原字符串有n个字符,i就等于n),此时tmp[i]未被赋值,是随机垃圾值。 - 第二个循环从
i >= 0开始,会先把这个垃圾值赋值给反转后字符串的开头,之后才开始复制有效字符,且循环结束后没有给反转后的字符串添加'\0',导致printf输出时读取到内存中的随机0,出现大量空格或垃圾数据。
- 第一个循环结束后,
修复后的代码
#include <stdio.h> void reverse(char theline[150]){ int i, j; char tmp[150]; // 复制原字符串到tmp,包括终止符 for (i = 0; theline[i] != '\0'; i++){ tmp[i] = theline[i]; } tmp[i] = '\0'; // 确保tmp也正确终止(可选,但更安全) // 从原字符串的最后一个有效字符开始反转 j = 0; for (i--; i >= 0; i--, j++){ theline[j] = tmp[i]; } theline[j] = '\0'; // 给反转后的字符串添加终止符 } int main() { char line[150]; char c; int counter = 0; do { counter = 0; // 读取一行,同时防止数组越界(最多读149个字符,留位置给终止符) while (((c = getchar()) != '\n') && (c != EOF) && (counter < 149)) { line[counter] = c; counter++; } line[counter] = '\0'; // 关键:添加字符串终止符 if (counter > 80){ reverse(line); printf("%s\n", line); } // 如果一行超过149字符,跳过剩余部分直到换行或EOF while (c != '\n' && c != EOF) { c = getchar(); } } while (c != EOF); return 0; }
关键修复说明
- main函数添加终止符:读取完一行后,必须执行
line[counter] = '\0';,确保reverse函数能正确识别字符串边界。同时添加了数组越界判断,防止输入过长导致缓冲区溢出。 - reverse函数调整循环起点:第一个循环结束后,
i是原字符串长度,执行i--让它指向最后一个有效字符,再开始复制,避免把垃圾值放到反转后的开头。 - 反转后添加终止符:循环结束后给
theline[j]赋值'\0',确保printf输出时能正确停止,不会读取垃圾数据。
内容的提问来源于stack exchange,提问作者MemoryDreams
相关产品推荐
相关产品推荐

