C语言字符串反转程序输出出现内存垃圾问题求助
问题分析与修复
你的代码里有几个关键错误导致了内存垃圾的出现,逐个拆解:
1. fgets换行符处理完全错误
string_test[strlen(string_test) - 1] = '\n';这行逻辑搞反了——fgets会把用户输入时的换行符'\n'一并读入字符串,你需要把这个换行符替换成字符串终止符'\0',否则字符串没有正确结束,后续的strlen计算、反转操作都会出错。
2. 反转函数的数组越界+字符串未终止
char str_copy[len];:数组大小设为len,但C语言数组下标从0开始,有效范围是0到len-1,你给str_copy[len]赋值属于越界访问,会破坏其他内存区域的数据。str_copy[len] = '\n';:C字符串必须以'\0'结尾,你赋值'\n'根本无法终止字符串,strcpy复制时会一直读到内存里的垃圾数据才停下。
3. 反转函数调用的长度参数错误
你在替换换行符之前就调用了strlen,此时字符串还包含换行符,导致传入reverse_string的长度多算了一个字符,应该先替换换行符,再获取正确的字符串长度。
修复后的完整代码
#include <stdio.h> #include <string.h> #define SIZE_STRING 20 void reverse_string(char* string, int len); int main() { char string_test[SIZE_STRING]; printf("What's the string? "); fgets(string_test, SIZE_STRING, stdin); // 替换fgets读取的换行符为字符串终止符 size_t str_len = strlen(string_test); if (str_len > 0 && string_test[str_len - 1] == '\n') { string_test[str_len - 1] = '\0'; str_len--; // 更新为去掉换行符后的长度 } reverse_string(string_test, str_len); printf("The new string is: %s\n", string_test); return 0; } void reverse_string(char* string, int len){ // 数组大小设为len+1,给终止符留位置 char str_copy[len + 1]; int i, j; for(i = 0, j = len - 1; i < len; i++, j--) { str_copy[i] = string[j]; } // 给复制后的字符串添加终止符 str_copy[len] = '\0'; strcpy(string, str_copy); }
额外优化建议
其实字符串反转不需要额外开辟数组空间,可以直接在原字符串上交换首尾字符,节省内存:
void reverse_string(char* string, int len){ int i, j; char temp; for(i = 0, j = len - 1; i < j; i++, j--) { temp = string[i]; string[i] = string[j]; string[j] = temp; } }
内容的提问来源于stack exchange,提问作者Afonso Britto
相关产品推荐
相关产品推荐

