前提・実現したいこと
構造体を定義し、構造体のポインタ配列のメモリを確保する。
そのあと、構造体ポインタ配列の要素を入力から出力し、まとめて表示する。
発生している問題・エラーメッセージ
入力したものがうまく表示されない
該当のソースコード
C
1(#)include <stdio.h> 2(#)include <stdlib.h> 3(#)define NUM 3 4(#)define NUM1 20 5 6struct result { 7 int number; 8 char name[NUM1]; 9 int english; 10}; 11 12int main(void) { 13 struct result *s_rt[NUM]; 14 15 int i; 16 for (i = 0; i < NUM; i++) { 17 s_rt[i] = (result*)malloc(sizeof(result)); 18 if (s_rt[i] == NULL) 19 printf("メモリの動的確保に失敗しました\n"); 20 21 else { 22 printf("%d番目の番号を入力してください:", i + 1); 23 scanf_s("%d", &s_rt[i]->number); 24 printf("%d番目の名前を入力してください:", i + 1); 25 scanf_s("%s", s_rt[i]->name, NUM1); 26 printf("%d番目の英語の点数を入力してください:", i + 1); 27 scanf_s("%d", &s_rt[i]->english); 28 } 29 free(s_rt[i]); 30 } 31 int j; 32 for (j = 0; j < NUM; j++) { 33 printf("番号:%d\n", s_rt[j]->number); 34 printf("名前:%s\n", s_rt[j]->name); 35 printf("英語の点数:%d\n", s_rt[j]->english); 36 } 37 return 0; 38}
試したこと
補足情報(FW/ツールのバージョンなど)
1番目の番号を入力してください:1
1番目の名前を入力してください:a
1番目の英語の点数を入力してください:1
2番目の番号を入力してください:4
2番目の名前を入力してください:b
2番目の英語の点数を入力してください:2
3番目の番号を入力してください:5
3番目の名前を入力してください:c
3番目の英語の点数を入力してください:3
番号:-572662307
名前:ンンンンンンンンンンンンンンンンンンンンンンンンンンンン
英語の点数:-572662307
番号:-572662307
名前:ンンンンンンンンンンンンンンンンンンンンンンンンンンンン
英語の点数:-572662307
番号:-572662307
名前:ンンンンンンンンンンンンンンンンンンンンンンンンンンンン・ン
英語の点数:-572662307
文字化けが起きてしまう
せめて、コンパイルが通るコードを書きましょう。
コードは、
```C
と
```
の間に書いてください。
ご返答ありがとうございます
このサイトを始めたのがついさっきだったもので、あまり慣れていませんでした。申し訳ないです。
コンパイルはCです。
サイトの使い方の話はさておき、まずあなたが実行したというコンパイルが通るコードを書かないと話が始まりません。
上に載せたソースコードとは別のコードですか?
はい。あなたが実行したというコンパイルが通るコードです。
「処理落ち」とは実行時エラーのことでしょうか。
エラーが発生しているときは実行時のエラーメッセージも質問に記載しましょう。
質問は編集できるので、ここに返信するのではなく追記をしてくださいね。
コンパイルが通るコードとは、何なのでしょうか。
プログラミング初心者でかつ、馬鹿なのでそこら辺のことを理解できていないです。申し訳ないです。教えていただけないでしょうか。
コンパイルってわかりますか?gccとか。
>matherさん
ご返答ありがとうございます。
実行し、キーボードから入力している途中、2番目の番号を入力した後に画面が止まってしまいます。
いつも出るようなエラー表示が出ないため困っている状態です。
> コンパイルが通るコードとは、
コンパイルエラーが出ずにコンパイルできるプログラムという意味です。
というか、コンパイルエラーの出るでたらめなプログラムじゃなくて、あなたが実行したというプログラムを書いてください。
そもそも、「コンパイル」がわかりませんか?
「いつも出るような」は私達にとってはわからないので、入力時に表示される部分("1番目の番号を入力してください:" などの部分)も含めて画面に出力されるものを全部見せてください。
scanf()またはscanf_s()は癖の有る関数です。scanf()はセグメントフォルト、scanf_s()は入りきれない文字を入力バッファに残したままになります。気をつけましょう。出来れば、fgets()とsscanf()を組み合わせて使うほうがいいと思います。
ちなみに2回めというのは、scanf_s("%d", &s_rt[i]->number);のs_rt[1]のアドレスがゴミだから固まる(処理系によって変わる)ですが・・・
えーと、"処理落ち"とは処理速度がガタ落ちすることであって、"処理が停止する"じゃないからね?
まるっとコピーしてください。
質問に書かれているソースコードでは「英語の点数」になっているのに、追記されたものでは「点数」になってますよ?
どっちが正しく、最新の情報なのでしょうか。
皆さん、ご返答ありがとうございます!
scanf_s("%s", s_rt[i]->name, NUM1);の記述がおかしい? →scanf_s("%s", &s_rt[i]->name, NUM1);
↑ミスです。忘れて下さいmm
回答2件
あなたの回答
tips
プレビュー