- ベストアンサー
ループを使用して変数に格納したい
====宣言===== 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の数分代入したい のですが、何か良い方法はありませんでしょうか? よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
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)
回答への補足です。 データを vvv 格納する際に vvv[] の先頭アドレスから前回まで格納されたデータ分だけずらしたアドレスにデータを格納しなければなりません。 sprintf は入力された文字列のバイト数を返すのでその値を offset に足していき、vvvの先頭アドレスからのずれとして利用しています。 一番最初のデータの格納ではもちろんvvvの先頭からの格納となるので offset = 0として、その後は格納されたデータ分だけずれていくという具合です。
- evans
- ベストアンサー率0% (0/1)
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); } } でどうでしょうか?
- happy_people
- ベストアンサー率30% (25/81)
#2のfor文の中のsprintfでvvvをvvvに転送するのは、スピードダウンになるのではありませんか?
- toysmith
- ベストアンサー率37% (570/1525)
少しだけ違うやり方(やってることは同じです)。 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()以外の関数呼び出しを避けてチョットだけスピードアップしてみました。
お礼
すみません、初心者なもので、少し解説していただけませんか?