====宣言=====
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件)

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

回答への補足です。



データを 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

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

このQ&Aと関連する良く見られている質問

Qint select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)について

見当違いな質問かもしれませんがお願いします。

複数のソケットを監視する際にselectを使う場合のことですが、
selectの動作と戻り値について疑問があります。

http://www.linux.or.jp/JM/html/LDP_man-pages/man2/select.2.html
ここを参照すると、selectの戻り値は
「更新された 3 つのディスクリプタ集合に含まれているディスクリプタの数 (つまり、 readfds, writefds, exceptfds 中の 1 になっているビットの総数) を返す。」
とあります。
私の中でselectは登録してあるFDのうち、一つでも動きがあれば即座にselectを抜けるもの、という認識です。
この認識だとreadfds,writefdsが引数として与えられているとしても、
どちらかのfd_setのうち、一つでも動きがあればselect文は
抜けてしまうことになります。とすると、戻り値として
「readfds, writefds, exceptfds 中の 1 になっているビットの総数」
は常に1ということになってしまいます。しかし、総数というからには
複数同時に1になることもあるはずです。

私の認識が間違っているとは思うのですが、どう間違っているのかわかりません。
select文の動きについて詳しく教えていただけないでしょうか。
または良いページがあれば教えてください。

見当違いな質問かもしれませんがお願いします。

複数のソケットを監視する際にselectを使う場合のことですが、
selectの動作と戻り値について疑問があります。

http://www.linux.or.jp/JM/html/LDP_man-pages/man2/select.2.html
ここを参照すると、selectの戻り値は
「更新された 3 つのディスクリプタ集合に含まれているディスクリプタの数 (つまり、 readfds, writefds, exceptfds 中の 1 になっているビットの総数) を返す。」
とあります。
私の中でselectは登録してあるFDのうち、一つでも動きが...続きを読む

Aベストアンサー

>私の中でselectは登録してあるFDのうち、一つでも動きがあれば即座にselectを抜けるもの、という認識です。
この認識はあっています。
しかし、selectを呼び出す以前にOKになっているFDがあれば、それらは全てビットがONになります。

話しを簡単にする為に、受信のみのソケットを3つ作成したとします。
これらの3つのソケットに向けて相手が電文を送ったとします。
その状態でまだ、こちらはselectを呼び出さずにいます。しばらくしてから、selectを呼び出すと、selectは即座にリターンし、3つのビットが一度にONになっているはずです。
一方、相手が、一切電文を送ってない状態で、selectを呼び出した場合は、何れかのビットがONになればリターンするので、そのときは、貴方が想像しているように
ビットの総数は1になる可能性が高いです。
従って、相手が電文を送る前にselectを呼び出すか、送った後にselectを呼び出すかは、その時のタイミングにより異なります。従って、ビット数の総和が常に1であるとは、考えない方が無難です。(1つのソケットしか使用しない場合は別ですが・・・)

>私の中でselectは登録してあるFDのうち、一つでも動きがあれば即座にselectを抜けるもの、という認識です。
この認識はあっています。
しかし、selectを呼び出す以前にOKになっているFDがあれば、それらは全てビットがONになります。

話しを簡単にする為に、受信のみのソケットを3つ作成したとします。
これらの3つのソケットに向けて相手が電文を送ったとします。
その状態でまだ、こちらはselectを呼び出さずにいます。しばらくしてから、selectを呼び出すと、selectは即座にリターンし、3つのビ...続きを読む

Qtypedef struct OBJECT NODE; の意味を教えてください。

C言語において、

typedef struct OBJECT NODE;

に、コメント文を付けるとしたらどのようになりますか??
よろしくお願いします。

Aベストアンサー

意味は「これから NODE って出てきたら struct OBJECT と同じことだからね」ということです。

コメントに関してですが、言語に親しんだ人であれば難なく理解できる個所にはコメントを書かないのが良いマナーであると思います。
過剰なコメントは可読性を損ねますから。

この場合はコメントをつけないのが正解だと思いますよ。

Q”int *a,*b”というポインタ変数宣言した値でa=&bということ

”int *a,*b”というポインタ変数宣言した値でa=&bということはできる?


”int *a,*b”このような変数をグローバル宣言した場合、
a=&bというようなことはできるのでしょうか?


”int *a,*b”
この宣言で、
aが10番地
bが20番地に定義されたと仮定しています。

Aベストアンサー

#6です。
>回答頂きありがとうございます。
>一応整理させてください。
>質問1:
>(1)int *a, *b; //宣言
>(2)a = b;
>これをメモリアドレスの変化で見ていった場合、
>(1)
>アドレス10:a NULL
>アドレス20:b (仮に1200)
>(2)
>アドレス10:a (仮に1200)
>アドレス20:b (仮に1200)
回答:
OKです。但し
アドレス10:a NULL のところは正確には、アドレス10:a 不定
となります。
不定の意味は初期化していないので何が入っているか判らない。
(0かも知れないし、そうでないかも知れない。あるいは35かも知れないし、そうでないかもしれない)
という意味です。(NULLの箇所は以降同じです)


>質問2:
>(1)' int *a, *b; //宣言
>(2)' a = (int *)&b;
>これをメモリアドレスの変化で見ていった場合
>(1)'
>アドレス10:a NULL
>アドレス20:b NULL
>(2)'
>アドレス10:a 20
>アドレス20:b NULL
>このような違いがあるということですね。
回答
はい、その通りです。

>質問3:
>int *a, *b; //宣言
>a=&b;
>このやり方はできないので、
>もし、やりたいのならば、
>(1)'' int **a, *b //宣言
>(2)'' a=&b;
>これをメモリアドレスの変化で見ていった場合
>(1)''
>アドレス10:a NULL
>アドレス20:b NULL
>(2)''
>アドレス10:a 20
>アドレス20:b NULL
>このようにメモリ内が変化していくということなんでしょうか?
回答
はい、その通りです。
>質問3のポインタのポインタの使い方はこれでよいでしょうか?
回答
はい、よいです。
ちなみに、このような事例に遭遇することはないでしょうが、
int ***a,**b;
の場合、a=&bは構文的に正しいです。
a=(int***)b;(強引なキャスト)
も正しいです。
int *a;
int **a;
int ***a;
の違いを理解することが必要です。
使いませんが、
int **********a;なども構文的にはありです。

#6です。
>回答頂きありがとうございます。
>一応整理させてください。
>質問1:
>(1)int *a, *b; //宣言
>(2)a = b;
>これをメモリアドレスの変化で見ていった場合、
>(1)
>アドレス10:a NULL
>アドレス20:b (仮に1200)
>(2)
>アドレス10:a (仮に1200)
>アドレス20:b (仮に1200)
回答:
OKです。但し
アドレス10:a NULL のところは正確には、アドレス10:a 不定
となります。
不定の意味は初期化していないので何が入っているか判らない。
(0かも知れないし、そうでないかも知れない。あるいは35かも知れない...続きを読む

Qvoid (*signal(int signum, void (*handler)(int)))(int);

の解釈を教えてください
最後の「(int)」については詳しくお願いします

Aベストアンサー

signalが

(1)1つ目の引数の型:int
(2)2つ目の引数の型:引数がintで戻り値がvoidである関数へのポインタ
(3)戻り値の型:引数がintで戻り値がvoidである関数へのポインタ(2と同じ)

を満たす関数である事を宣言しています。最後の(int)はsignalの戻り値の
関数ポインタがint型の引数を持つ事を示しています。

「引数がintで戻り値がvoidである関数へのポインタ」の型をHANDLERと表すと

HANDLER signal(int signum, HANDLER handler);

となります。

Qint kosuu; とstruct tanka_kosuu kosuu[10]; の関係は

同プログラムの内容で現在3個の質問をしておりますが!
 その質問を解決する上で4つ目の質問をさせていただきます。
 悪しからず・・・
 さて
以下のサイトのプログラムで 些細な疑問がございます。
https://oshiete.goo.ne.jp/qa/9062058.html
 で
 struct tanka_kosuu {
int tanka; 
int kosuu; 
int kingaku; /
以上の中にあるkosuuと
 struct tanka_kosuu kosuu[10];のkosuu[10]とは直接関係がありますか?
 馬鹿な質問ばかりで申し訳ございませんがよろしくお願いいたします。

Aベストアンサー

#No.1です。

>kosuu[10];をakb[10];変えたところ 以下の errorでてコンパイルできません!?
> example10.c(15) : error C2065: 'kosuu' : 定義されていない識別子です。


宣言している変数名を変更したら、その変数を利用している場所(エラーメッセージで15行目と書かれています)の変数名も変更する必要があると思いませんか?

下の例で、1行目も変数をaからbに変えたら、2行目,3行目のaも、bに変える必要があのはご理解いただけますよね?
01: int a;
02: a = 10;
03: printf("a=%d\n", a);


人気Q&Aランキング

おすすめ情報