- ベストアンサー
構造体のすべての変数を文字列に変換する方法
- 以下のような3つの構造体が与えられたときに、構造体tdが初期化されているとします。
- 構造体tdのすべての要素を文字列に変換する方法はありますか?
- ひとつひとつsprintfを使って変換するのは、ソースファイルにひとつずつ書かなければならず、効率的ではありません。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
乱暴なやりかただけど... struct td data ; char *p = (char*)&data; for(int i=0;i<sizeof(struct td);i++) printf("%02X",p[i]);
その他の回答 (2)
- n2201makita
- ベストアンサー率30% (8/26)
めんどうと言われますが、なにがめんどうなのか、もう一度考えてください。 C/C++スレなので一応プログラムしました。 #include <stdio.h> struct area{ int x; int y; int r[20]; }; struct pinf{ //struct area; struct area u; int s; int r[18]; }; struct td{ char no[4]; char name[20]; struct pinf p1,p2[10]; int tpc; int r[20]; }; area_print(struct area *U){ int i; printf("%d\n", U->x); printf("%d\n", U->y); printf("%d", U->r[i=0]); while(i<20) printf(", %d", U->r[++i]); puts(""); } pinf_print(struct pinf *S){ int i; area_print(&S->u); printf("%d\n", S->s); printf("%d", S->r[i=0]); while(i<18) printf(", %d", S->r[++i]); puts(""); } td_print(struct td *T){ int i; printf("\"%s\"\n", T->no); printf("\"%s\"\n", T->name); puts("pinf p1"); pinf_print(&T->p1); for(i=0;i<20;i++){ printf("pinf p2[%d]\n", i); pinf_print(&T->p2[i]); } printf("%d\n", T->tpc); printf("%d", T->r[i=0]); while(i<20) printf(", %d", T->r[++i]); puts(""); } struct td *test; main(){ test = malloc(sizeof *test); td_print(test); }
- kumonomoto
- ベストアンサー率41% (12/29)
■ひとつひとつ sprintf を使って変換するのは、ソースファイルにひとつずつ書かなければならず、あまり用いたくありません。 ということは文字列変換用の関数を作ってその中でsprintfを使って格納していくのも嫌なんですよね……。 自分で書いておいてアレですけど難解なものになりました。 intが共用体で一括りに出来るのが幸いしましたね。 バラバラでもunion増やしたりダミーデータ入れたりすれば対応出来そうですが。 #include <stdio.h> #include <stddef.h> //offsetof()を使用するために必要 //struct td内のp1,p2[10],tpc,r[20]を全て合計したintの数。因みにint472個分 #define ARRAY_SIZE ((sizeof(struct pinf) + sizeof(struct pinf) * 10 + sizeof(int) + sizeof(int) * 20) / sizeof(int)) //hozon.text[ARRAY_SIZE][10]内の位置をstruct tdのメンバを記述することで取得する #define GET_POS(m) ((offsetof(struct td, m) - offsetof(struct td, i[0])) / sizeof(int)) struct area{ int x; int y; int r[20]; }; struct pinf{ struct area a; int s; int r[18]; }; struct td{ char no[4]; char name[20]; union{ struct{ struct pinf p1; //sizeof(struct pinf) struct pinf p2[10]; //sizeof(struct pinf) * 10 int tpc; //sizeof(int) int r[20]; //sizeof(int) * 20 }; int i[ARRAY_SIZE]; }; }; //文字列に変換したデータを保存するための構造体 struct hozon{ char no[4]; char name[40]; char text[ARRAY_SIZE][10]; //正負の整数8桁まで対応(10桁でないのは-符号と終端文字'\0'の2BYTE分) }; main() { int ct; struct td t; struct hozon h; //tに数値を1から順に入力していく for( ct = 0 ; ct < ARRAY_SIZE ; ct++ ) t.i[ct] = ct; //適当な位置に適当な数値を入力しておく t.p2[5].a.r[15] = -1234567; //文字列の部分はそのままstruct hozon構造体に格納 sprintf( h.no, "%s", t.no ); sprintf( h.name, "%s", t.name ); //intの部分を文字列に変換してstruct hozon構造体に格納していく for( ct = 0 ; ct < ARRAY_SIZE ; ct++ ) sprintf( h.text[ct], "%d", t.i[ct] ); //実行結果は全て3です printf( "t.p1.a.r[1] = %d\n", t.p1.a.r[1] ); printf( "GET_POS() = %s\n", h.text[GET_POS( p1.a.r[1] )] ); printf( "t.i[3] = %d\n", t.i[3] ); printf( "h.text[3] = %s\n\n", h.text[3] ); //実行結果は全て471です printf( "t.r[19] = %d\n", t.r[19] ); printf( "GET_POS() = %s\n", h.text[GET_POS( r[19] )] ); printf( "t.i[ARRAY_SIZE - 1] = %d\n", t.i[ARRAY_SIZE - 1] ); printf( "h.text[ARRAY_SIZE - 1] = %s\n\n", h.text[ARRAY_SIZE - 1] ); //実行結果は全て-1234567です printf( "t.p2[5].a.r[15] = %d\n", t.p2[5].a.r[15] ); printf( "GET_POS() = %s\n", h.text[GET_POS( p2[5].a.r[15] )] ); printf( "t.i[263] = %d\n", t.i[263] ); printf( "h.text[263] = %s\n", h.text[263] ); } 半角スペース2個分を全角スペース1個に置き換えていますので、使用する際は置換して下さい。