• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:構造体のすべての変数を文字列に変換したい)

構造体のすべての変数を文字列に変換する方法

このQ&Aのポイント
  • 以下のような3つの構造体が与えられたときに、構造体tdが初期化されているとします。
  • 構造体tdのすべての要素を文字列に変換する方法はありますか?
  • ひとつひとつsprintfを使って変換するのは、ソースファイルにひとつずつ書かなければならず、効率的ではありません。

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

  • ベストアンサー
  • YEND77
  • ベストアンサー率56% (21/37)
回答No.1

乱暴なやりかただけど... struct td data ; char *p = (char*)&data; for(int i=0;i<sizeof(struct td);i++)   printf("%02X",p[i]);

その他の回答 (2)

回答No.3

めんどうと言われますが、なにがめんどうなのか、もう一度考えてください。 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); }

回答No.2

■ひとつひとつ 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個に置き換えていますので、使用する際は置換して下さい。

関連するQ&A

専門家に質問してみよう