我试图在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++;
}
}
答案 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
。