为什么这个 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;
这是一个查找字符串并集的函数。
#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;