簡體   English   中英

在C程序中連接兩個char *字符串

[英]Concatenate two char* strings in a C program

我寫了以下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);

這是你玩的一個例子。 它非常簡單,沒有硬編碼長度。 你可以在這里試試: 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;
 }

是一個有效的解決方案:

#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字符串文字的字符復制到他們, strcat到的字符追加str2到年底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][][][][][][][][][][][][][][][]

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM