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

C语言打印char*字符串仅输出第一个字符的问题排查

问题修复说明

你遇到的输出异常由三处核心错误导致,对应修复方案如下:

错误1:主函数接收返回值类型错误

ft_substr的返回值是指向完整子串的char*指针,你代码中char sub = *ft_substr(hello, 1, 4);直接对返回指针解引用,只会取出子串的第一个字符赋值给单字节char变量。后续用%s打印&sub时,仅能访问栈上单个字节的空间,自然只能输出第一个字符。
修复方案:用char*类型接收返回值:

char *sub = ft_substr(hello, 1, 4);

错误2:子串内存提前释放,返回悬垂指针

你在ft_substr内部打印完成后直接调用free(str)释放了申请的子串内存,再返回str指针时,该指针指向的空间已经被系统回收,属于非法访问的悬垂指针,任何后续操作都是未定义行为。
修复方案:删除ft_substr内部的free(str);语句,将内存释放操作移到主函数使用完子串之后执行。

错误3:字符串结束符赋值越界

循环结束时计数变量j的值等于子串长度len,str[j]就是子串末尾预留的结束符位置,你写的str[j + 1] = '\0';会超出申请的内存边界,同时导致子串无正确结束符,打印时会出现乱码。
修复方案:修改结束符赋值逻辑为:

str[j] = '\0';

修复后完整代码

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

char *ft_substr (const char *s, unsigned int start, size_t len)
{
    char        *str;
    unsigned int    i;
    unsigned int    j;

    // 可选补充:添加原字符串为空、start超过原字符串长度等边界判断
    str = malloc(len * sizeof(char) + 1);
    // 可选补充:判断malloc是否申请失败返回NULL
    i = start;
    j = 0;
    while (i < len + start)
    {
        str[j] = s[i];
        j++;
        i++;
    }
    str[j] = '\0';
    printf("ft_substr内打印:%s\n", str);
    return (str);
}

int main (void)
{
    char hello[] = "Hello World";
    char *sub = ft_substr(hello, 1, 4);

    printf("主函数内打印:%s\n", sub);
    // 使用完子串后释放内存
    free(sub);
    return (0);
}

内容的提问来源于stack exchange,提问作者Michael Short

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 06:48:02