我的 strcat 代码中的 printf 有什么问题?

What's wrong with printf in my strcat code?

我制作了这个程序来模拟 strcat 的功能,但是 printf 有一个我不明白的错误...

代码如下:

#include <stdio.h>

char *mystrcat(char *s1, char *s2);

int main(void)
{
    char *s1,*s2;
    s1="asdad";
    s2="asdad";
    s1=mystrcat(s1,s2);
    printf(s1);

    return 0;
}
char *mystrcat(char *s1,char *s2)
{
    int i,j;
    for(i=0;s1[i]<'[=10=]';i++) ;
    for(j=0;s2[j]!='[=10=]';j++) s1[i+j]=s2[j];
    s1[i+j]='[=10=]';
    return s1;
}

至少,s1[i] < '[=10=]'s1[i] < 0是一样的,总是假的。

第一个问题是 s1 没有足够的 space 来追加 s2。您需要 s1 指向的缓冲区的大小至少为 strlen(s1) + strlen(s2) + 1+ 1 是 NUL 终止符)。

第二个问题是字符串文字是只读的。您从 "asdad" 分配 s1,这会创建一个指向(可能)只读内存的指针。当然,第一个问题意味着你没有足够的 space 追加到末尾,即使它是可写的,但这是 C 中常见的陷阱之一,值得一提。

第三个问题(在中已经提到)是比较s1[i] < '[=17=]'是错误的,你不会正确找到s1的长度,因为循环不会运行 甚至单次迭代。正确的条件与第二个循环 != '[=19=]' 中的相同。 (这掩盖了问题 1,从那以后你无意中从头开始覆盖了 s1。)