====宣言=====
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の数分代入したい
のですが、何か良い方法はありませんでしょうか?
よろしくお願いします。

A 回答 (5件)

回答への補足です。



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

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);
}
}

でどうでしょうか?
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/04/17 12:21

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

    • good
    • 0

少しだけ違うやり方(やってることは同じです)。



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()以外の関数呼び出しを避けてチョットだけスピードアップしてみました。
    • good
    • 0

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;
}

これでどうでしょう?
本当なら、もっとエラー処理が必要ですが、とりあえず代入部だけ。
検証してないので、バグるかも。。。。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


このカテゴリの人気Q&Aランキング

おすすめ情報

カテゴリ