C语言自定义trim函数if判断不触发、realloc未执行问题求解
问题1:if判断不触发、realloc未执行的原因
- 最直接的错误是字符和字符串比较逻辑错误:
s[i]是单个char类型的字符,而你写的" "是双引号包裹的字符串常量,本质是指向只读内存中字符数组的指针,两者类型完全不匹配,判断条件永远为假,所以if分支永远不会执行。正确的空格判断应该用单引号包裹的字符常量:if (s[i] == ' ') - 其次
realloc的用法完全不符合要求:realloc的第一个参数必须是malloc/calloc/realloc返回的堆内存指针,你传入的是字符串字面量,存储在进程的只读数据段,根本不属于堆内存,对它调用realloc本身就是未定义行为,就算判断条件写对了也会崩溃。
问题2:提示"s未初始化就被使用"的原因
你传入trim函数的参数是字符串字面量" a b ",属于只读常量,不能被修改。你尝试对只读常量指向的内存执行realloc操作,编译器检测到你在尝试修改未在堆上分配的内存,就会抛出未初始化/非法访问类的警告。另外你完全没有接收realloc的返回值:realloc不会修改传入的原指针,会将新的内存地址作为返回值返回,你当前的写法就算realloc执行成功,也拿不到新的内存指针。
正确实现方案
你需要先统计前缀空格数、后缀空格数,计算出有效内容长度后,一次性申请新的堆内存,将有效内容拷贝到新内存后返回即可:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> char* trim(const char* s) { if (s == NULL) { return NULL; } size_t len = strlen(s); // 统计前缀空格数 size_t start = 0; while (start < len && isspace((unsigned char)s[start])) { start++; } // 统计后缀空格数 size_t end = len; while (end > start && isspace((unsigned char)s[end - 1])) { end--; } size_t valid_len = end - start; // 申请新内存,多1字节存'\0' char* res = (char*)malloc(valid_len + 1); if (res == NULL) { return NULL; } // 拷贝有效内容 strncpy(res, s + start, valid_len); res[valid_len] = '\0'; return res; } int main(void) { char* trimmed = trim(" a b "); printf("修剪后结果:|%s|\n", trimmed); // 输出|a b| free(trimmed); // 用完记得释放堆内存 return 0; }
注意:调用方使用完返回的字符串后,需要手动调用
free释放内存,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Gabriel Burzacchini
相关产品推荐
相关产品推荐

