我仍然是C中指针的新手,并且一直在尝试创建字符串函数。这个应该连接两个字符串,但是当我尝试运行它时,它会崩溃。
void concatenate (char *a, char *b, int size_a, int size_b) {
char *c, *d, *e;
c = a;
d = b;
int i, j, k;
int l = 1;
for(i = 0; i<size_a; i++) {
*(e+i) = *(c+i);
}
for (j = size_a; j<size_a+size_b; j++) {
*(e+j) = *(d+(j-(j-l)));
l++;
}
for (k = 0; k< size_a+size_b; k++){
printf("%c",*(e+k));
}
}
我做错了什么?
答案 0 :(得分:2)
您正在尝试访问未初始化指针e
指向的内存,这会导致未定义的行为。
您的功能应如下所示:
char* concatenate (const char *a, const char *b, int size_a, int size_b) {
// create new string:
char* newStr = malloc (size_a + size_b + 1);
int i, j;
// copy first string into it:
for (i = 0; i<size_a; i++)
newStr[i] = a[i];
// copy second string into it:
for (j = 0; j < size_b; j++)
newStr[i + j] = b[j];
newStr[i + j] = '\0';
return newStr;
}
请注意,函数不会更改传递给它的字符串,因此它们可以作为const
传递。 size_a
和size_b
应该等于strlen(a)
和strlen(b)
,这也意味着如果您始终将以null结尾的字符串传递给此函数,则可以计算它们在身体内的长度(因此你可以摆脱最后两个参数)。
答案 1 :(得分:0)
e是未初始化的指针,这意味着它指向内存中的某个随机位置。当你开始写它时,就好像它是一个指向字符数组的指针一样,你的程序会崩溃(或者更糟糕的是,稍后会神秘地改变一些状态导致未指定的行为)。
答案 2 :(得分:0)
你的代码似乎没有任何理由混淆。问题是你要分配给e
,这是未初始化的。以下几乎是您的代码以更易读的形式并且分配了e
。不过,我还没有测试过它。
void concatenate (char *c, char *d) {
char *e;
e = calloc(strlen(c) + strlen(d) + 1, sizeof(char));
int i, j;
int l = 1;
for(i = 0; c[i]; i++) {
e[i] = c[i];
}
l = i;
for (j = 0; d[j]; j++) {
e[l + j] = d[j];
}
e[l + j] = '\0';
printf("%s", e);
free(e);
}