Edited at

同じ文字列を複数結合する in C

More than 1 year has passed since last update.

ある文字列inputを複数個つなげた文字列outputを生成する必要に駆られた。

例えば、inputabcだとすると、outputとしてabcabcabcabcabcを生成する、という感じ。

これから、char型配列inputの中身の文字列を5個つなげて、別のchar型配列outputに吐き出す方法を考える。

outputinputに比して十分に大きいものとする。


そのまんま

size_t input_len = strlen(input);

for(int i = 0; i < 5; i++){
for(size_t j = 0; j <= input_len; j++){
output[j + i*input_len] = input[j];
}
}

配列inputの中身を5回、input_lenだけずらしてコピーする。

内側のforループの継続条件がj <= input_lenなのは、最後にヌル文字を残すため。

おすすめ度:★★


標準ライブラリ関数使えよ

size_t input_len = strlen(input);

for(int i = 0; i < 5; i++){
strcpy(output+i*input_len,input);
}

やってることは前と同じ。ただし標準ライブラリ関数を使ったことでネストが浅くなった。

おすすめ度:★★★


文字列処理の十徳ナイフ

sprintf(output,"%s%s%s%s%s",input,input,input,input,input);

文字列処理で何かと役に立つsprintfだが、今回は適役ではないようだ。

おすすめ度:★


結合するならこれだろ

for(int i = 0; i < 5; i++){

strcat(output,input);
}

"String Concatenation"というだけあってその通りのことをやってくれる。

ただ、これだとoutputが初期化されていない時に変なことになるので、こっちの方がいいだろう。

2015/08/17 コメントを参考に編集

output[0] = '\0';

for(int i = 0; i < 5; i++){
strcat(output,input);
}

おすすめ度:★★★★


番外編:C++なら

真のC++erは裸のchar型配列ではなくstd::stringを使う。

inputoutputを両方ともstd::stringとして宣言しておけば次のようにできる。

for(int i = 0; i < 5; i++){

output += input;
}


結論

strcatを使いましょう。

C++が使えるならstd::stringを使おう。