在C程序中连接两个char *字符串

我写了以下C程序:

int main(int argc, char** argv) { char* str1; char* str2; str1 = "sssss"; str2 = "kkkk"; printf("%s", strcat(str1, str2)); return (EXIT_SUCCESS); } 

我想连接两个字符串,但它不起作用。

它的工作方式是:

  1. Malloc内存足以容纳str1和str2的副本
  2. 然后它将str1复制到str3中
  3. 然后它将str2附加到str3的末尾
  4. 当你使用str3时,你通常可以free (str3);使用str3 free (str3);

这是你玩的一个例子。 它非常简单,没有硬编码长度。 你可以在这里试试: http : //ideone.com/d3g1xs

有关char大小的信息,请参阅此post

 #include  #include  int main(int argc, char** argv) { char* str1; char* str2; str1 = "sssss"; str2 = "kkkk"; char * str3 = (char *) malloc(1 + strlen(str1)+ strlen(str2) ); strcpy(str3, str1); strcat(str3, str2); printf("%s", str3); return 0; } 

这是一个有效的解决方案:

 #include  #include  int main(int argc, char** argv) { char str1[16]; char str2[16]; strcpy(str1, "sssss"); strcpy(str2, "kkkk"); strcat(str1, str2); printf("%s", str1); return 0; } 

输出:

 ssssskkkk 

你必须为你的字符串分配内存。 在上面的代码中,我将str1str2声明为包含16个字符的字符数组。 我使用strcpy将字符串文字的字符复制到它们中,并使用strcatstr2的字符附加到str2的末尾。 以下是这些字符数组在程序执行期间的外观:

 After declaration (both are empty): str1: [][][][][][][][][][][][][][][][][][][][] str2: [][][][][][][][][][][][][][][][][][][][] After calling strcpy (\0 is the string terminator zero byte): str1: [s][s][s][s][s][\0][][][][][][][][][][][][][][] str2: [k][k][k][k][\0][][][][][][][][][][][][][][][] After calling strcat: str1: [s][s][s][s][s][k][k][k][k][\0][][][][][][][][][][] str2: [k][k][k][k][\0][][][][][][][][][][][][][][][] 

strcatstr2连接到str1

您将获得运行时错误,因为未正确分配str1进行连接

当您使用字符串文字时,例如"this is a string" ,在您的情况下为"sssss""kkkk" ,编译器会将它们放在只读内存中。 但是, strcat尝试在第一个参数之后写入第二个参数。 您可以通过制作足够大小的目标缓冲区并写入它来解决此问题。

 char destination[10]; // 5 times s, 4 times k, one zero-terminator char* str1; char* str2; str1 = "sssss"; str2 = "kkkk"; strcpy(destination, str1); printf("%s",strcat(destination,str2)); 

请注意,在最近的编译器中,您通常会收到将字符串文字转换为非常量字符指针的警告。

strcat(str1, str2)在str1之后追加str2。 它要求str1有足够的空间来容纳str2。 在你的代码中,str1和str2都是字符串常量,所以它不应该工作。 你可以这样试试:

 char str1[1024]; char *str2 = "kkkk"; strcpy(str1, "ssssss"); strcat(str1, str2); printf("%s", str1); 

strcat尝试将第二个参数追加到第一个参数。 由于您要分配隐式大小的常量字符串,因此这不起作用。

如果您只想打印两个字符串

 printf("%s%s",str1,str2); 

会做。

你可以做点什么

 char *str1 = calloc(sizeof("SSSS")+sizeof("KKKK")+1,sizeof *str1); strcpy(str1,"SSSS"); strcat(str1,str2); 

创建连接字符串; 但是强烈考虑使用strncat / strncpy。 并仔细阅读上面的手册页。 (哦,不要忘记最后free str1)。