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
相关产品推荐
相关产品推荐

