C语言void类型strip_out函数如何让指针指向新创建的字符串
核心问题说明
- 你当前定义的
temp是函数栈上的局部变长数组,函数执行完成后这块内存会被系统自动回收,即便强行让外部指针指向temp的地址,后续访问也会触发野指针错误。 - 你当前的函数形参是
char *str,属于指针传值,函数内部修改str本身的指向不会同步到外部传入的原指针,修改没有意义。 - 你现有代码中
temp数组末尾没有补上字符串结束符\0,即使拷贝完成也不是合法的C字符串。
可行方案
方案1:原地修改(优先推荐,完全符合你不能修改返回值、不能改函数签名的要求)
直接在原传入的字符串内存上做过滤逻辑,不需要额外开辟临时数组,代码如下:
#include <ctype.h> #include <string.h> void strip_out(char *str) { int i = 0, j = 0; while (str[i] != '\0') { if (isalpha((unsigned char)str[i])) { str[j++] = str[i]; } i++; } // 补上字符串结束符 str[j] = '\0'; }
注意:该方案要求外部传入的str指向可写的内存区域(比如字符数组、malloc分配的堆内存),不能是只读的字符串常量。
方案2:返回新分配的字符串(需要修改函数形参为二级指针)
如果你的场景不允许修改原字符串,必须生成新字符串,可以通过二级指针修改外部指针的指向,内部用malloc申请堆内存存储结果,代码如下:
#include <ctype.h> #include <string.h> #include <stdlib.h> void strip_out(char **str) { if (str == NULL || *str == NULL) return; int len = strlen(*str); // 申请足够的堆内存,最多存len个字符+1个结束符 char *temp = malloc(len + 1); if (temp == NULL) return; int i = 0, j = 0; while ((*str)[i] != '\0') { if (isalpha((unsigned char)(*str)[i])) { temp[j++] = (*str)[i]; } i++; } temp[j] = '\0'; // 修改外部指针的指向 *str = temp; }
注意:该方案使用时外部需要传入指针的地址,函数执行完成后*str指向新分配的过滤后的字符串,使用完后需要手动调用free释放内存避免泄漏。
内容的提问来源于stack exchange,提问作者jewishfish
相关产品推荐
相关产品推荐

