ある文字列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
を使おう。