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

如何将C语言函数返回的字符串数组复制到静态二维字符数组?

解决C语言动态字符串数组转静态二维字符数组的问题

问题根源

你之前尝试的memcpy和错误的strcpy循环之所以失败,核心原因是两种数组的内存结构完全不同:

  • search_regex返回的char**是指针数组,每个元素是指向堆内存中单个字符串的地址;
  • 静态二维数组char hold[3][100]是连续的字符块,每行直接存储字符串内容,而非指针地址。

直接用memcpy复制指针地址到hold,只会把堆内存的地址写到静态数组里,完全不是你需要的字符串内容;如果循环strcpy没成功,大概率是没处理空指针、行数限制或缓冲区溢出问题。

正确实现步骤

  1. 先调用search_regex获取匹配结果,检查返回值是否为NULL;
  2. 循环遍历匹配结果,将每个字符串复制到静态数组的对应行,注意控制行数和字符串长度,避免越界;
  3. 复制完成后释放search_regex分配的动态内存,防止内存泄漏。

完整示例代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <regex.h>

#define MAX_MATCHES 10
#define BUFFER_SIZE 100

char **search_regex(const char *string, const char *regex) {
    regex_t preg;
    int rv;
    size_t nmatch = MAX_MATCHES;
    regmatch_t pmatch[MAX_MATCHES];
    char **matches = malloc(MAX_MATCHES * sizeof(char *));

    // 编译正则表达式
    rv = regcomp(&preg, regex, REG_EXTENDED);
    if (rv != 0) {
        char error_message[BUFFER_SIZE];
        regerror(rv, &preg, error_message, BUFFER_SIZE);
        fprintf(stderr, "正则编译失败 '%s': %s\n", regex, error_message);
        return NULL;
    }

    // 执行匹配
    rv = regexec(&preg, string, nmatch, pmatch, 0);
    if (rv == 0) {
        int i;
        for (i = 0; i < MAX_MATCHES; i++) {
            if (pmatch[i].rm_so == -1) {
                break; // 无更多匹配
            }
            int start = pmatch[i].rm_so;
            int end = pmatch[i].rm_eo;
            int length = end - start;
            matches[i] = malloc((length + 1) * sizeof(char));
            strncpy(matches[i], &string[start], length);
            matches[i][length] = '\0';
        }
        // 剩余未匹配的位置设为NULL,方便后续判断
        for (; i < MAX_MATCHES; i++) {
            matches[i] = NULL;
        }
    } else {
        // 匹配失败时,初始化所有指针为NULL
        for (int i = 0; i < MAX_MATCHES; i++) {
            matches[i] = NULL;
        }
    }

    regfree(&preg);
    return matches;
}

int main() {
    char hold[3][100] = {0}; // 初始化所有元素为0,确保终止符有效
    const char* target_str = "Hello 123 World 456 Test 789";
    const char* regex_pattern = "[0-9]+";
    
    char** matches = search_regex(target_str, regex_pattern);
    if (matches == NULL) {
        fprintf(stderr, "正则匹配失败\n");
        return 1;
    }
    
    // 复制匹配结果到静态数组
    for (int i = 0; i < 3; i++) { // 最多复制3个,对应hold的3行
        if (matches[i] == NULL) {
            break; // 无更多匹配,终止循环
        }
        // 用strncpy限制复制长度,避免缓冲区溢出,手动添加终止符
        strncpy(hold[i], matches[i], 99);
        hold[i][99] = '\0';
        
        free(matches[i]); // 释放单个字符串的堆内存
    }
    
    free(matches); // 释放指针数组本身的内存
    
    // 输出验证结果
    for (int i = 0; i < 3; i++) {
        if (strlen(hold[i]) > 0) {
            printf("hold[%d]: %s\n", i, hold[i]);
        }
    }
    
    return 0;
}

关键注意事项

  • 空指针检查:必须判断matches[i]是否为NULL,避免访问无效内存;
  • 长度限制:用strncpy而非strcpy,并手动设置终止符,防止字符串过长导致缓冲区溢出;
  • 内存释放:复制完成后务必释放search_regex分配的所有动态内存,避免内存泄漏;
  • 初始化静态数组:hold[3][100] = {0}确保每行都有默认的终止符,即使没有复制内容也能安全访问。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 09:25:44