- ベストアンサー
classmate[a].nameがうまく出力できない理由
- classdataクラスのoutputseiseki関数では、指定された番号のclassmateのnameを表示しようとしているが、うまくいっていない。
- ソースコードを確認すると、classmateデータ構造体のnameは文字列を格納するためのchar型配列であり、15文字まで格納できる。
- しかし、outputseiseki関数では、%sフォーマットでnameを表示しようとしているが、name[15]のように具体的なインデックスを指定していないため、正しい結果が得られていない可能性がある。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
main()関数がないのでどのように呼び出したのかがわからないのですが、おそらくdatacntを初期化していないのが原因ではないかと思います。classdata::inputclass()でデータを入力するのでしょうが、datacntを設定しているコードが見当たりません。
その他の回答 (1)
- gimmick
- ベストアンサー率49% (134/270)
これだけでは何とも言えません。どのようにうまくいかないのかを補足してください。
補足
ソースはこれだけですが、inline void classdata::outputseiseki()を使うと画面にint a で選択した構造体のchar nameを表示するという仕組みをしたかったのです。ですが、実際は 成績を表示します。 番号= scanf("%d",&a); 名前= となるだけでした。 成績を表示します。 番号= scanf("%d",&a); 名前= classmate[a].name としたかったです。 説明が足りませんでした。すみませんでした。 それから、早速の回答ありがとうございます。 #include<stdio.h> #include<iostream> #include<string.h> #define member 40 #define filename "data.txt" class classdata { private: int datacnt; struct seiseki { int kokugo; int syakai; int sugaku; int rika; int eigo; }; struct classmatedata { char name[15]; int age; char sex[1]; struct seiseki ten; }classmate[member]; public: inline void classdata::inputclass(); inline void classdata::outputclass(); inline void classdata::sortclass(); inline void classdata::saveclass(); inline void classdata::loadclass(); inline void classdata::inputseiseki(); inline void classdata::outputseiseki(); }; inline void classdata::inputclass() { printf("個人情報を入力します。\n"); printf("name= "); scanf("%s",classmate[datacnt].name); printf("age= "); scanf("%d",&classmate[datacnt].age); printf("sex= "); scanf("%s",classmate[datacnt].sex); datacnt++; } inline void classdata::outputclass() { printf("個人情報を表示します。\n"); int a; for(a=0;a<datacnt;a++) { printf("番号=%d 名前=%s 年齢= %d 性別=%s\n",a,classmate[a].name,classmate[a].age,classmate[a].sex); } } inline void classdata::sortclass() { int m,n; for(m=0;m<datacnt-1;m++) { for(n=m+1;n<datacnt;n++) { if(strcmp(classmate[m].name,classmate[n].name)>0) { classmatedata tmp; tmp=classmate[m]; classmate[m]=classmate[n]; classmate[n]=tmp; } } } } inline void classdata::saveclass() { FILE *stream; stream=fopen(filename,"wb"); fwrite(classmate,sizeof(classmatedata),datacnt,stream); fclose(stream); } inline void classdata::loadclass() { FILE *stream; datacnt=0; stream=fopen(filename,"rb"); while(1) { if(fread(&classmate[datacnt],sizeof(classmatedata),1,stream)<1)break; datacnt++; } fclose(stream); } inline void classdata::inputseiseki() { int a; printf("成績を入力します。 番号="); scanf("%d",&a); printf("名前=%s\n",classmate[a].name); printf("国語="); scanf("%d",&classmate[a].ten.kokugo); printf("社会="); scanf("%d",&classmate[a].ten.syakai); printf("数学="); scanf("%d",&classmate[a].ten.sugaku); printf("理科="); scanf("%d",&classmate[a].ten.rika); printf("英語="); scanf("%d",&classmate[a].ten.eigo); } inline void classdata::outputseiseki() { int a; printf("成績を表示します。 番号="); scanf("%d",&a); printf("名前=%s\n",classmate[a].name); printf("国語=%d 社会=%d 数学=%d 理科=%d 英語=%d\n",classmate[a].ten.kokugo,classmate[a].ten.syakai,classmate[a].ten.sugaku,classmate[a].ten.rika,classmate[a].ten.eigo); }
お礼
この度は回答していただきありがとうございました。もう一度ソースを見直し、main関数内のwhile構文を変更したところうまく直りました。ありがとうございました。
補足
main関数のファイルはこれです。ありがとうございます。やってみます。 --------------------------------------------- #include"classdata.h" #include<stdio.h> void loop_sub(); void main() { classdata cdata; int whi; while(1) { printf("0:終了 1:入力 2:表示 3:ソート 4:セーブ 5:ロード 6:成績 ="); scanf("%d",&whi); switch(whi) { case 0: goto _exit; break; case 1: cdata.inputclass(); break; case 2: cdata.outputclass(); break; case 3: cdata.sortclass(); break; case 4: cdata.saveclass(); break; case 5: cdata.loadclass(); break; case 6: loop_sub(); break; default: break; } } _exit:; } void loop_sub() { classdata cdata; int loop; while(1) { printf("0:終了 1:成績入力 2:成績表示 ="); scanf("%d",&loop); switch(loop) { case 0: goto _exit_sub; break; case 1: cdata.inputseiseki(); break; case 2: cdata.outputseiseki(); break; default: break; } } _exit_sub:; }