ある文字列inputを複数個つなげた文字列outputを生成する必要に駆られた。
例えば、inputがabcだとすると、outputとしてabcabcabcabcabcを生成する、という感じ。
これから、char型配列inputの中身の文字列を5個つなげて、別のchar型配列outputに吐き出す方法を考える。
outputはinputに比して十分に大きいものとする。
そのまんま
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を使う。
input、outputを両方ともstd::stringとして宣言しておけば次のようにできる。
for(int i = 0; i < 5; i++){
output += input;
}
結論
strcatを使いましょう。
C++が使えるならstd::stringを使おう。