• ベストアンサー

ループを使用して変数に格納したい

====宣言===== typedef struct{ int a; int b; int c; }ABC; typedef struct{ int d; //e配列の個数 ABC e[10]; }DEF; char vvv[BUFSIZ]; ====宣言===== 上記宣言がされている場合、 vvvにカンマ編集でa,b,c,a,b,c・・・ というデータをsprintfでdの数分代入したい のですが、何か良い方法はありませんでしょうか? よろしくお願いします。

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

  • ベストアンサー
  • madman
  • ベストアンサー率24% (612/2465)
回答No.1

main() { int i; DEF def; /*defの構造体にデータの代入*/ memset(vvv, \0, BUFSIZ); for(i=0; i<def.d; i++) { sprintf(&www[strlen(www)], "%d,%d,%d,", def.e[i].a, def.e[i].b, def.e[i].c); } /* 最後のカンマを消す */ www[strlen(www)-1] = \0; } これでどうでしょう? 本当なら、もっとエラー処理が必要ですが、とりあえず代入部だけ。 検証してないので、バグるかも。。。。

その他の回答 (4)

  • evans
  • ベストアンサー率0% (0/1)
回答No.5

回答への補足です。 データを vvv 格納する際に vvv[] の先頭アドレスから前回まで格納されたデータ分だけずらしたアドレスにデータを格納しなければなりません。 sprintf は入力された文字列のバイト数を返すのでその値を offset に足していき、vvvの先頭アドレスからのずれとして利用しています。 一番最初のデータの格納ではもちろんvvvの先頭からの格納となるので offset = 0として、その後は格納されたデータ分だけずれていくという具合です。

  • evans
  • ベストアンサー率0% (0/1)
回答No.4

DEF def; と仮定 int i; int offset; char vvv[BUFSIZ]; if( def.d < 10 ) { offset = 0; for(i = 0; i < d; i++) { offset += sprintf(vvv + offset,"%d,%d,%d,",def.e[i].a,def.e[i].b,def.e[i].c); } } でどうでしょうか?

sting
質問者

お礼

すみません、初心者なもので、少し解説していただけませんか?

回答No.3

#2のfor文の中のsprintfでvvvをvvvに転送するのは、スピードダウンになるのではありませんか?

  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.2

少しだけ違うやり方(やってることは同じです)。 if (d > 0) { sprintf(vvv, "%d, %d, %d", def[0].a, def[0].b, def[0].c) ; } for (i = 1 ; i < d ; i++) { sprintf(vvv, "%s, %d, %d, %d", vvv, def[i].a, def[i].b, def[i].c) ; } dが1以上を保証されていればif文なしでsprintf()しても可。 sprintf()以外の関数呼び出しを避けてチョットだけスピードアップしてみました。

関連するQ&A