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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 02:30:01