You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 03:05:26