22

次の C プログラムを作成しました。

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

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

    return (EXIT_SUCCESS);
 }

2 つの文字列を連結したいのですが、うまくいきません。

4

6 に答える 6

38

それが機能する方法は次のとおりです。

  1. str1 と str2 のコピーを保持するのに十分な大きさの malloc メモリ
  2. 次に、str1 を str3 にコピーします。
  3. 次に、str3 の最後に str2 を追加します。
  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

文字列にメモリを割り当てる必要があります。上記のコードでは、 andを 16 文字を含む文字配列として宣言str1しています。str2以前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 に連結str2しますstr1

str1連結用に適切に割り当てられていないため、実行時エラーが発生します

于 2013-08-27T14:29:37.073 に答える
2

"this is a string"とのような文字列リテラルを使用する"sssss""kkkk"、コンパイラはそれらを読み取り専用メモリに配置します。ただし、strcat最初の引数の後に 2 番目の引数を書き込もうとします。この問題は、十分なサイズの宛先バッファを作成してそこに書き込むことで解決できます。

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

最近のコンパイラでは、通常、文字列リテラルを非 const 文字ポインタにキャストすると警告が表示されることに注意してください。

于 2013-08-27T14:32:14.197 に答える
1

strcat2 番目のパラメータを最初のパラメータに追加しようとします。暗黙的にサイズ設定された定数文字列を割り当てているため、これは機能しません。

2 つの文字列を出力するだけの場合

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 を忘れないでください)。

于 2013-08-27T14:30:34.173 に答える