LoginSignup
4
8

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-08-16

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

4
8
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
8