• ベストアンサー

sprintf

文字列に1文字を結合したいんだけど、 例えば  char str[] = "xy";  char c = 'z'; があって、2つを結合する場合、 #include <iostream.h> main(){  char str[] = "xy";  char c = 'z';  char buf[2];  buf[0] = c;  buf[1] = 0;  strcat(str, buf);  cout << str; } でもいいけど、もっと簡単にする方法があったら教えてください。  char str[] = "xy";  char c = 'z';  sprintf(str, "%s%c\0", str, c);  cout << str; イメージ的にこうだけど、失敗しました。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

単純に main() { char str[10] = "xy"; char c = 'z'; strncat(str, &c, 1); cout << str; } でいいですけど・・・ 他の方が言われているように、 strは結合後の文字列を表現できる、十分なサイズを確保しておいてください。

A__
質問者

お礼

ありがとうございます。

その他の回答 (3)

  • haporun
  • ベストアンサー率40% (230/562)
回答No.4

sprintfは、第1引数の書き込みバッファと、第3引数以降の読み込みバッファに、同じものが指定されている場合の動作は定義されていません。 ポインタマニアのhaporunでした。

A__
質問者

お礼

ありがとうございます。 それは重要ですね。

  • itohh
  • ベストアンサー率45% (210/459)
回答No.2

こんにちは。itohhといいます。 > char str[] = "xy"; これは、2バイトのエリアしか確保されていません。 そこへ、文字列を追加すると他のエリアを壊すことになります。 > char str[] = "xy"; > char c = 'z'; > > char buf[2]; > > buf[0] = c; > buf[1] = 0; > strcat(str, buf); これも実際はエリアを壊しています。 str[]としたからといって可変の配列になるというわけではないということです。 コンパイル時にコンパイラが判断して2バイトのエリアを確保します。 試しに、   char buf1[100];        <-この行を追加 > char str[] = "xy"; > char c = 'z'; > > char buf[4];         <-変更 > > buf[0] = c;         <-変更 > buf[1] = c;         <-変更 > buf[2] = c;         <-変更 > buf[3] = 0;         <-変更 > strcat(str, buf); > cout << str;         <-(1) として実行してみてください。 そして、(1)でブレイクポイントを設けて(1)まで実行してみてください。 ブレイクポイントで停止したとき変数の内容を確認すると「buf1」のエリアを 壊していないでしょうか?

A__
質問者

補足

ありがとうございます。 でも、予想どおりの結果だったから他のエリアの破壊は 確認できませんでした。 char buf1[100] = "abcdefghijklmnopqr"; char str[] = "xy"; char c = 'z'; char buf[4]; buf[0] = c; buf[1] = c; buf[2] = c; buf[3] = 0; strcat(str, buf); cout << str << "\n" << buf1; //// xyzzz //// abcdefghijklmnopqr

回答No.1

1byte文字1個の扱いは面倒なんで、自分なら1個でも文字列として扱っちゃいますね。 sprintf()がうまくいかないのは、第一引数と展開される引数のstrが同じ領域 なんでうまくいかないのでは?(コピー元と先が同じ) 最悪、関係ない領域(strの後ろの領域)をつぶしますよ。 バッファサイズは常に気をつける必要がありますが、チェックなしでコード書く ならこんな感じ。 -- char str2[BUFSIZ]; sprintf(str2,"%s%c", str, c); cout<<str2; -- 文字列リテラルに"hogehoge\0"なんてやる必要ないですよ。"hogehoge"で充分。 Cの文字列リテラルは最後が'\0'で終わる決まりになってるので。 つまり、"a\0"というのは、'a',0,0の3bytesの並びの領域となります。

A__
質問者

お礼

ありがとうございます。 その方法でもできました。 でも、 char str2[BUFSIZ]; を用意しないといけないから、新しく変数を 用意しなくてもできる方法を探しているんです。

関連するQ&A