使用指针实现strcat()

max*_*015 1 c pointers kernighan-and-ritchie

我正在阅读K&R并尝试使用指针编写strcat版本(将一个字符串附加到另一个字符串的末尾).这就是我所拥有的:

#include<stdio.h>
void mystrcat(char *s,char *t)
{
    while(*s++);
    *s--;
    while(*s++ = *t++);
}

int main()
{
    int size = 1024;
    char *s1, *s2;
    s1 = malloc(size);
    s2 = malloc(size);
    s1 = "Hello ";
    s2 = "World";
    mystrcat(s1,s2);
    printf("%s",s1);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

该程序运行但直接崩溃,对指针不是很有经验,所以无法解决错误.

Bal*_*arq 6

问题出在这里:

s1 = malloc(size);
s2 = malloc(size);
s1 = "Hello ";
s2 = "World";
Run Code Online (Sandbox Code Playgroud)

你已经为s1和分配了空间s2,但是不是使用它,而是让它们指向字符串文字.这些字符串文字存储在内存的不可写的位置(即,你不应该乱用它).

简而言之,您必须将代码更改为:

s1 = malloc(size);
s2 = malloc(size);
strcpy( s1, "Hello " );
strcpy( s2, "World" );
Run Code Online (Sandbox Code Playgroud)

现在您正在使用分配的空间.希望这可以帮助.

编辑:你这里也有问题:

void mystrcat(char *s,char *t)
{
    while(*s++);
    *s--;
    while(*s++ = *t++);
}
Run Code Online (Sandbox Code Playgroud)

第二行应该是s--,而不是*s--.*s--会减少指针s并访问新位置.您实际上不需要取消引用指针只是为了减少它.您只希望指针在指向现在之前指向一个位置.那很简单s--.