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

时间:2013-08-27 14:26:59

标签: c

我写了以下C程序:

int main(int argc, char** argv) {

    char* str1;
    char* str2;
    str1 = "sssss";
    str2 = "kkkk";
    printf("%s", strcat(str1, str2));

    return (EXIT_SUCCESS);
 }

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

6 个答案:

答案 0 :(得分:21)

它的工作方式是:

  1. Malloc内存足以容纳str1和str2的副本
  2. 然后将str1复制到str3
  3. 然后它将str2附加到str3的末尾
  4. 当您使用str3时,通常会将其释放free (str3);
  5. 这是你玩的一个例子。它非常简单,没有硬编码长度。你可以在这里试试:http://ideone.com/d3g1xs

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

    #include <stdio.h>
    #include <memory.h>
    
    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;
     }
    

答案 1 :(得分:16)

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

#include <stdio.h>
#include <string.h>

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的字符附加到str1的末尾。以下是在执行程序期间这些字符数组的外观:

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][][][][][][][][][][][][][][][]

答案 2 :(得分:3)

strcatstr2联合到str1

您将收到运行时错误,因为str1未正确分配用于连接

答案 3 :(得分:2)

当您使用字符串文字(例如"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));

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:1)

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。)