• ベストアンサー

構造体配列をきれいに表示するには

ある架空の会社の社員のデータをまとめるプログラムを構造体を使って行なっています。下のソースを実行すると、きれいに表のようにそろえたかったのですが、0がずれて分かりにくいものになってしまいました。 #include<stdio.h> struct syain_dt{ long no; char name[20]; char yaku[20]; int nensu; struct kyuuyo{ long kihon; long jyutaku; long kazoku; long sikaku; long goukei; }kyu; };int main(void) {   struct syain_dt syomu[20]={ {78027,"神保直樹","課長",21,346780,10000,15000,12000}, {84004,"相原彰子","主任",15,223640,10000, 0, 6000}, {87022,"本郷幸子"," ",12,208760,10000, 0, 6000}, {93042,"三上葵"," ",6,176530, 0, 0, 0}, {95005,"佐々木翠"," ",4,166700, 0, 0, 0}, {99009,"長崎宏美"," ",1,150140, 0, 0, 0} };int i; for(i=0;syomu[i].no!=0;i++){ syomu[i].kyu.goukei=syomu[i].kyu.kihon+syomu[i].kyu.jyutaku +syomu[i].kyu.kazoku+syomu[i].kyu.sikaku; } for(i=0;syomu[i].no!=0;i++){ printf("%d %s %s %d %d %d %d %d %d\n", syomu[i].no,syomu[i].name,syomu[i].yaku,syomu[i].nensu, syomu[i].kyu.kihon,syomu[i].kyu.jyutaku, syomu[i].kyu.kazoku,syomu[i].kyu.sikaku, syomu[i].kyu.goukei); } return(0); } これはどうにかできないのでしょうか?分かる方がいたらお願いします。

noname#47478
noname#47478

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

  • ベストアンサー
  • alphion
  • ベストアンサー率19% (27/136)
回答No.2

printf("%8d %8s %8s %8d %8d %8d %8d %8d %8d\n", とか

その他の回答 (1)

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

printf() の書式指定子で出力幅を指定すればいいのでは?そうゆうことではなく?

関連するQ&A

  • 構造体の配列について

    --------------------------------------------------- #include<stdio.h> #include<string.h> struct person{ char name[80]; int height; int weight; }; int main() { struct person dt[10]; strcpy(dt[1].name,"日本太郎");    //// (1) //// dt[1].weight=70; dt[1].height=180; dt[5]=dt[1];    //// (2) //// printf("%s %d %d \n",dt[1].name,dt[1].weight,dt[1].height); return 0; } ----------------------------------------------------- 以上のプログラムは参考書に記述されていたものですが、(1)の部分で、配列名dtに「"日本太郎"」を設定するならわかるのですが、配列の1つの要素「dt[1]」に「"日本太郎"」を設定しているというように見え、これはエラーが出ると感じたのですが出ません。 char dt[10]; strcpy(dt[1],"日本太郎"); 以上のようにしてしまっているというイメージがあります。 後、(2)の部分もよくイメージがわきません。 以上、どのような仕組みになっているのか教えていただければ嬉しいです。

  • 構造体の配列について(2)

    前回「構造体の配列について」という質問タイトルで、質問させていただいたのですが、理解が完全ではないため同じようなプログラム内容ではありますが、疑問を書かせていただきます。よろしくお願いします。 ----------------------------------------------------------------------- #include<stdio.h> #include<string.h> struct person{ char name[1];    //// (1) //// int height; int weight; }; int main() { struct person dt[10]; strcpy(dt[0].name,"日本一郎"); strcpy(dt[2].name,"関東次郎"); strcpy(dt[9].name,"関西三郎"); dt[1].weight=99; dt[1].height=168; printf("%s %s %s %d %d \n",dt[0].name,dt[2].name,dt[9].name,dt[1].weight,dt[1].height); return 0; } ----------------------------------------------------------------------- 以上のプログラムの(1)の部分で、文字を1文字しか格納出来ないのに、 strcpy(dt[0].name,"日本一郎"); strcpy(dt[2].name,"関東次郎"); strcpy(dt[9].name,"関西三郎"); としても何故正しく実行できるのかわかりません。 前回いろいろとご回答いただいたのに、しっかりと理解できない者ですが、教えていただければ嬉しいです。

  • 構造体についてです。

    身体測定表を作っていて最初に作ったデータを変更して表示したいのですがNo1の168cm→162cm No2の74kg→74.5kg  No3の20歳→19歳 No4の田中三郎→小林三郎 (No3と4は構造体ポインタを使ってデータを変更) 全データを表示させてその後No1と3の名前~体重を丸ごと入れ替えて全データを表示させたいのですがエラーがでてしまいます。 分かる人がいましたらどこを直したらいいか教えて下さい。 #include <stdio.h> #include <string.h> struct data{ int no; char name[21]; int age; int height; float weight; }; struct data *sp; void main(){ int i; struct data a[4]={ {1,"鈴木太郎",23,168,60}, {2,"山本次郎",17,180,74}, {3,"山田花子",20,156,53}, {4,"田中三郎",35,172,68}, }; struct data b; for(i=0;i<4;i++){ printf("番号 :%d\n",a[i].no); printf("名前 :%s\n",a[i].name); printf("年齢 :%d歳\n",a[i].age); printf("身長 :%dcm\n",a[i].height); printf("体重 :%4.1fkg\n\n",a[i]. weight); } a[0].height=162; a[1].weight=74.5; *sp[2].age=19; strcpy(*sp[3].name,"小林三郎"); for(i=0;i<=4;i++){ b=a[0]; a[0]=a[2]; a[2]=b; a[0].no=1; a[2].no=3; } for(i=0;i<=4;i++){ printf("番号 :%d\n",a[i].no); printf("名前 :%s\n",a[i].name); printf("年齢 :%d歳\n",a[i].age); printf("身長 :%dcm\n",a[i].height); printf("体重 :%4.1fkg\n\n",a[i].weight); } }

  • 構造体のリスト

    ご質問させていただきます。 下記は拾ったソースをちょっとアレンジしたものなのですがエラーはなく動きます。 struct seiseki { int no; /* 学生番号 */ char name[20]; /* 氏名 */ double average; /* 平均値 */ }; int main(void) { int i; struct seiseki seito[20] = { { 1, "SAKURAI", 78.6 }, { 2, "NAGANO", 57.3 }, { 3, "TAKESHITA", 66.4 }, }; for(i = 0; i < 3; i++) { printf("%d %s %5.1f\n", seito[i].no, seito[i].name, seito[i].average); } return 0; } これを、もうちょっと応用を利かせ、 固定されているデータ部分 { 1, "SAKURAI", 78.6 }, { 2, "NAGANO", 57.3 }, { 3, "TAKESHITA", 66.4 }, をテキストファイルなどからfgetと組み合わせてデータを取りたいのです。 どうやればよいのかネット上を探してみたのですが、 なかなか似たようなものがありませんでした。 どうやればよいのでしょうか。 また、これは可能なのでしょうか。 教えてください。 また、参考になる書籍、URLなどもあれば併せて教えていただければ幸いです。

  • 構造体のキャスト

    はじめまして。 C言語初心者です。今回の質問は構造体のメンバを他の構造体に格納するときにおきる不可解な現象です。 具体的には、 typedef struct gmsg{ int a; int b; int Dt[4]; }GMSG 上記のDt[4]を以下の構造体に代入していきます。 typedef struct msg{ char a; char b; char c; char d; int e; short f; char g; char h; char i; char j; char k; char l; char m; char n; short o; }MSG この際に以下のような処理を行っています。 この際GMSGを(ポインタ)pt_msgdt,(ポインタ)MSGをpt_SubDtとし、 pt_SubDt->a = (char)(pt_msgdt->Dt[0] ) & 0xFF; pt_SubDt->b = (char)(pt_msgdt->Dt[0] >>8) & 0xFF; pt_SubDt->c = (char)(pt_msgdt->Dt[0] >> 16 ) & 0xff; pt_SubDt->d = (char)(pt_msgdt->Dt[0] >> 24)& 0xff; pt_SubDt->e = (pt_msgdt->Dt[1]) & 0xFFFFFFFF; pt_SubDt->f = (short)(pt_msgdt->Dt[2] & 0xFFFF); pt_SubDt->g = (char)((pt_msgdt->Dt[2] >> 16) & 0xFF); pt_SubDt->h = (char)((pt_msgdt->Dt[2] >> 24 ) & 0xFF); pt_SubDt->i = (char)(pt_msgdt->Dt[3]) & 0xFF; pt_SubDt->j = (char)(pt_msgdt->Dt[3] >> 8) & 0xFF; pt_SubDt->k = (char)(pt_msgdt->Dt[3] >> 16) & 0xFF; pt_SubDt->l = (char)(pt_msgdt->Dt[3] >> 24) & 0xFF; pt_SubDt->m = (char)(pt_msgdt->Dt[4]) & 0xFF; pt_SubDt->n = (char)(pt_msgdt->Dt[4] >> 8) & 0xFF; pt_SubDt->o = (short)(pt_msgdt->Dt[4] >> 16) & 0xFFFF; } しかし処理結果をデバック中にDt[0],Dt[3],Dt[4]の0x79以下のデータはキャストが行いますが,0x80~0xffのデータに関しては4byteになり 0xffffff**といったキャスト結果になってしまいます。 例えると Dt[3]=0x000000f120; 処理結果 h = 0x00 g = 0x00 f = 0xFFFFF120 といった結果になってしまいます。 この結果を0x80以上でもint->char,int->shortのようにキャストく色々な方法を試しましたが、わかりません。 よろしくお願いします。 ちなみにOSはLinux,コンパイラーはC言語で扱っているデータはリトルエンディアンのバイナリデータです。

  • C言語での構造体

    C言語の構造体で配列を扱うとき、 struct ○○{  char ○○[○] とすれば出来ますが、同じようにして構造体で二次元配列を扱うことは出来ますか? 一度組んでみたのですが、 #include<stdio.h> struct aaa{ int no; char name[128]; char y_name[128]; char n_name[128]; char s_name[128][128]; }; int main(void){ int i; struct aaa iryo[99]; printf("入力前\n"); /* 構造体配列に scanf()でデータを入力 */ for(i = 0; i < 3; i++) { // printf("input...\n"); scanf("%d", &iryo[i].no); scanf("%s", iryo[i].name); scanf("%s", iryo[i].y_name); scanf("%s", iryo[i].n_name); scanf("%s", iryo[i].s_name); } printf("入力後\n"); printf("出力前\n"); /* 入力データの確認 */ for(i = 0; i < 3; i++) { printf("番号:%02d 内容:%s Y分岐:%s N分岐:%s 他分岐:%s\n", iryo[i].no, iryo[i].name, iryo[i].y_name, iryo[i].n_name, iryo[i].s_name); } printf("出力後\n"); printf("%d",sizeof(struct aaa)); return 0; } としたら、エラーは出ませんが、実行すると何も表示されませんでした。

  • 構造体を使ったプログラム

    学校でC言語を勉強しています。(まだ初心者です) テストの成績を入力して、その結果を降順にソートしたいんですけど、 下記のプログラムでは、正常に動かないです。 struct seiseki { char nama; int sansuu; int rika; int goukei; }; ~~~~~~~~~~~~~~~~~~~~ struct seiseki class_a; struct seiseki class_b; struct seiseki *ptr1; struct seiseki *ptr2; ptr1 = class_a; ptr2 = class_b; ~~~~成績はあらかじめ入力済み~~~~ sout(class_a, 3); sout(class_b, 3); void sout(struct seiseki *p, int num) { struct seiseki temp; int count; int j; for (count = 1; num > count; count++) { temp = p[count]; for (j = count; j > 0 && p[j - 1].goukei < temp.goukei; j--) { p[j] = p[j - 1]; } p[j] = temp; p++; } } class_aだけを実行するプログラムだとちゃんと表示されますが、 一度でclass_aとclass_bを実行するプログラムだと表示がおかしくなります。 どなたか教えてください。

  • 構造体について

    凄く初歩的な質問で申し訳ありませんが… 入門書の構造体のところで 以下のようなプログラムの例がありました。 #include <stdio.h> struct seiseki { /* 構造体の宣言 */ int no; char name[20]; double average; }; int main(void) { int i; struct seiseki seito1, seito2[20]; /* 構造体変数と構造体配列の宣言 */ >char name[20] というのは、NAMEの領域を20文字 確保すると言うことですよね? >struct seiseki seito1, seito2[20] ここの箇所が分からないのですが seito2[20]の20というのは どうして20なのですか? NAMEだけではないので もっと大きな数字になるような気がするのですが… またseito1の方は どうして数字が何もないんですか? 考え違いをしているところを ご指摘して頂ければ幸いです。

  • C#で構造体の配列を持った構造体を使いたいのですが

    C#で構造体の配列を持った構造体を使いたいのですが Cならば struct xyz { struct abc _abc[32]; int index; }; struct abc { int a; int b; int c; }; struct xyz _xyz[8]; xyz[0]._abc[3].b = 1; のような使い方で という感じで やっていた事を C#で 同じような事をやろうとしても うまくいきません うまくやる方法をどなたかご存知ないでしょうか Visual Studio 2005行った場合 コンパイルで 構文エラーです。不適切な配列の宣言子です。マネージ配列を宣言するには、次元指定子を変数の識別子の前に指定します。固定サイズ バッファ フィールドを宣言するには、フィールド型の前に fixed キーワードを使用します となり fixed をつけると 固定サイズ バッファの型は次のうちの 1 つでなければなりません: bool、byte、short、int、long、char、sbyte、ushort、uint、ulong、float または double となってしまいます

  • 構造体を型の異なる構造体に代入

    C言語初心者です。 今回の質問は入力された構造体のメンバのデータを型の異なる構造体に代入したいのですが、毎回コンパイラにおこられてしまいます(汗)具体的には typedef struct MSG{ longint type; int flg; int Dt[64]; }t_msg; このDt[64]を以下の構造体に代入します。 typedef struct SC_MSG{ char a; char b; short c; char d; char e; short f; }t_sc_msg; その際、異なる関数で処理するため、 main(){ foo(&t_msg); }; void foo(t_msg *pt_msgdt){ t_sc_msg = (*pt_msgdt+8); ココがエラーになってしまいます。 何か、根本的な間違いをおかしている気がします。 ご指導の方、宜しくお願いします。 ちなみにOSはLinuxでコンパイラーはgccです。