22

我编写了以下 C 程序:

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

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

    return (EXIT_SUCCESS);
 }

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

4

6 回答 6

38

它的工作方式是:

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

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

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

#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;
 }
于 2013-08-27T14:36:31.790 回答
23

是一个有效的解决方案:

#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

您必须为字符串分配内存。在上面的代码中,我将str1和声明str2为包含 16 个字符的字符数组。我曾经strcpy将字符串文字的字符复制到其中,strcat并将字符附加str2str1. 以下是这些字符数组在程序执行期间的样子:

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][][][][][][][][][][][][][][][]
于 2013-08-27T14:33:45.750 回答
3

strcat 连接str2str1

您将收到运行时错误,因为str1没有为连接正确分配

于 2013-08-27T14:29:37.073 回答
2

When you use string literals, such as "this is a string" and in your case "sssss" and "kkkk", the compiler puts them in read-only memory. However, strcat attempts to write the second argument after the first. You can solve this problem by making a sufficiently sized destination buffer and write to that.

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

Note that in recent compilers, you usually get a warning for casting string literals to non-const character pointers.

于 2013-08-27T14:32:14.197 回答
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。并仔细阅读上面的手册页。(哦,别忘了freestr1 最后)。

于 2013-08-27T14:30:34.173 回答
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);
于 2013-08-27T14:30:04.357 回答