为什么这个 C 字符串联合函数不起作用 - 段错误?

why is this C union of strings function not working - segfault?

这是一个查找字符串并集的函数。

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdbool.h>



char* my_union(char* param_1, char* param_2)
{
    char *res[strlen(param_1) + strlen(param_2)];  //allocate long enough string

    //check if the letter is in result res string 
    for(int i = 0 ; i < strlen(param_1);i++){
        if(strchr(*res,param_1[i]) == NULL){// this checks for duplicates
            res[i] = param_1[i];
        }
    }

    for(int i = 0 ; i < strlen(param_2);i++){
        if (strchr(*res, param_2[i])== NULL){//this checks for duplicates too
            *res[i] = param_2[i];
        }
    }

    printf("%s\n", *res);
    return *res;

}


int main(){
    char *s1 = "zpadinton" ;
    char *s2 =  "paqefwtdjetyiytjneytjoeyjnejeyj";
    my_union(s1,s2);// must return "zpadintoqefwjy"
   //the union is zpadintoqefwjy
    return 0;
}

一些基本错误:

  • char *res[] 是一个指针数组。你不想要那个。

  • strlen(param_1) + strlen(param_2) 不够长,您没有为空终止符分配 space。

  • return *res; 返回指向局部变量的指针总是错误的,因为当函数 returns.

    时该变量超出范围

    您要么需要让被调用者进行分配并写入传递的参数之一,要么需要为字符串动态分配内存。

值得注意的是,由于您错误地使用了指针数组,因此 res[i] = param_1[i]; 之类的东西应该不会干净地编译。您将收到警告“来自不兼容类型的赋值”/“来自没有强制转换的整数的指针”或类似的警告。

始终阅读并更正警告。对于初学者来说,警告几乎可以 100% 确定为错误。将您的警告级别提高到最大甚至更好,首先阻止无效代码的编译。例如 gcc/clang/icc: -std=c11 -pedantic-errors -Wall -Wextra -Werror.

char *res[strlen(param_1) + strlen(param_2)]; //allocate long enough string

您不能在堆栈上分配动态长度。你需要在堆上分配它,像这样:

char *res = malloc(strlen(param_1) + strlen(param_2)+1);

(注:空终止符多加一个字节)

您需要将缓冲区设置为零才能稍后使用 strchr:

memset(res, 0, strlen(param_1) + strlen(param_2)+1);

if(strchr(*res,param_1[i]) == NULL){// this checks for duplicates res[i] = param_1[i]; }

strchr 应该采用 res,而不是 *res。 分配给索引 i 将不起作用,因为您需要在结果字符串的末尾添加新字符。

int j=0;
for(int i = 0 ; i < strlen(param_1);i++){
    if(strchr(res,param_1[i]) == NULL){// this checks for duplicates
        res[j] = param_1[i];
        j++;
    }
}

for(i = 0 ; i < strlen(param_2);i++){
    if (strchr(res, param_2[i])== NULL){//this checks for duplicates too
        res[j] = param_2[i];
        j++;
    }
}

printf("%s\n", res);
return res;