在C中连接两个字符串使用指针

时间:2015-04-09 12:03:19

标签: c string pointers

我试图在C中使用指针连接两个字符串,但它不能100%工作。在输出String的末尾,出现许多未知字符......

char* concat_string (char* s1, char* s2) {
    char *s;
    int k=0;
    s=(char *)malloc((strlen(s1)+strlen(s2))*sizeof(char));
    while (*s1!='\0') {
        *(s+k)=*s1;
        k++;
        s1++;
    }
    while (*s2!='\0') {
        *(s+k)=*s2;
        k++;
        s2++;
    }
    return s;
}

int main () {
    char *ch1, *ch2, *s;
    char cch1[10], cch2[10];
    printf("ch1 ?  ");
    scanf("%s",cch1);
    printf("ch2 ?  ");
    scanf("%s",cch2);
    ch1=cch1;
    ch2=cch2;
    s=concat_string(ch1, ch2);
    printf("\n%s + %s = ", ch1, ch2);
    while (*s!='\0') {
        printf("%c", *s);
        s++;
    }
}

2 个答案:

答案 0 :(得分:3)

您没有在连接结果中包含终结符的空间。这样:

s=(char *)malloc((strlen(s1)+strlen(s2))*sizeof(char));

应该是:

s = malloc(strlen(s1) + strlen(s2) + 1);

你也不是复制终结者,这解释了你所看到的结果。

另外,不要在C中转换malloc()的返回值,并输入字符串const

您的代码很难阅读。使用整数索引变量而不是仅仅使用指针会使它变得不必要地复杂化。作为参考,以下是我将如何编写它:

char * concat_string(const char *s1, const char *s2)
{
  char *s = malloc(strlen(s1) + strlen(s2) + 1);
  if(s != NULL)
  {
    char *p = s;
    while((*p++ = *s1++) != '\0');
    --p;
    while((*p++ = *s2++) != '\0');
  }
  return s;
}

这当然有点简洁,但我认为它比你的版本更具可读性。

答案 1 :(得分:0)

printf期望以null结尾的字符串。否则,它将打印内存中的任何字符,直到它击中一个。您的concat_string函数不会在字符串上放置空终结符。

char* concat_string (char* s1, char* s2){char *s;int k=0;
s=(char *)malloc((strlen(s1)+strlen(s2))*sizeof(char));
while(*s1!='\0'){*(s+k)=*s1;k++;s1++; }
while(*s2!='\0'){*(s+k)=*s2;k++;s2++;}
*(s+k) = 0;
return s;
}

此外,此功能已经为您编写,只需尝试使用strcat