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

字符数组反转功能异常排查求助:代码问题分析

字符数组反转代码的问题分析与修正

先逐个拆解你代码里的核心问题:

1. str_len函数的问题

  • index未初始化:局部变量index没有赋值就直接使用,初始值是随机垃圾值,会导致访问数组时越界,甚至触发程序崩溃。
  • 参数类型错误:你要处理的是字符数组,参数应该是char *str而非int *str——虽然字符本质是ASCII数值,但int*的指针步长是4字节,会导致访问数组元素时跳着读取,完全不符合预期。
  • 隐含风险:如果传入的数组不是以'\0'结尾的字符串,这个函数会一直越界访问,必须确保输入是合法的C风格字符串。

2. ft_rev_int_tab函数的问题

  • 函数定位错误:函数名和参数都是针对int数组的,但你实际要实现字符数组反转,参数应改为char *tab;而且你直接覆盖了传入的size参数,完全忽略外部传入的长度值,不符合函数设计逻辑。
  • 循环无实际操作:循环里的tab[size];只是读取了数组元素的值,没有做任何交换操作,根本没实现反转逻辑。
  • 循环逻辑错误:反转数组需要首尾元素交换,应该用两个索引分别从数组头和尾向中间移动,直到相遇,而不是单纯从尾到头遍历。

修正后的代码

针对字符数组(字符串)的实现

修正后的长度计算函数

int str_len(char *str) 
{
    int index = 0; // 必须初始化索引为0

    while (str[index] != '\0')
    {
        index++;
    }

    return index;
}

修正后的反转函数

void ft_rev_char_tab(char *tab)
{
    int len = str_len(tab);
    int start = 0;
    int end = len - 1; // 最后一个有效元素的索引,排除结束符'\0'
    char temp;

    while (start < end)
    {
        // 交换首尾元素
        temp = tab[start];
        tab[start] = tab[end];
        tab[end] = temp;
        // 向中间移动索引
        start++;
        end--;
    }
}

如果你实际需要反转int数组(而非字符数组)

int数组没有'\0'结束符,必须依赖传入的size参数,修正后的代码如下:

void ft_rev_int_tab(int *tab, int size)
{
    int start = 0;
    int end = size - 1;
    int temp;

    while (start < end)
    {
        temp = tab[start];
        tab[start] = tab[end];
        tab[end] = temp;
        start++;
        end--;
    }
}

内容的提问来源于stack exchange,提问作者Omar Ghazi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 12:35:03