次の C プログラムを作成しました。
int main(int argc, char** argv) {
char* str1;
char* str2;
str1 = "sssss";
str2 = "kkkk";
printf("%s", strcat(str1, str2));
return (EXIT_SUCCESS);
}
2 つの文字列を連結したいのですが、うまくいきません。
次の C プログラムを作成しました。
int main(int argc, char** argv) {
char* str1;
char* str2;
str1 = "sssss";
str2 = "kkkk";
printf("%s", strcat(str1, str2));
return (EXIT_SUCCESS);
}
2 つの文字列を連結したいのですが、うまくいきません。
それが機能する方法は次のとおりです。
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
文字列にメモリを割り当てる必要があります。上記のコードでは、 andを 16 文字を含む文字配列として宣言str1
しています。str2
以前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][][][][][][][][][][][][][][][]
strcat
に連結str2
しますstr1
str1
連結用に適切に割り当てられていないため、実行時エラーが発生します
"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 文字ポインタにキャストすると警告が表示されることに注意してください。
strcat
2 番目のパラメータを最初のパラメータに追加しようとします。暗黙的にサイズ設定された定数文字列を割り当てているため、これは機能しません。
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 を忘れないでください)。