例えば、下記で一応動作します。
ただし、学校のレポートっぽいので完全な答えを書くとためにならないですから、一見動作するように見えて致命的なバグを新たに1つ仕込んでます。このまま提出すると丸写しであることが簡単にバレます。意味が判れば簡単に取れるバグです。
sizeof, malloc, free, ポインタについてGoogle先生に良く聞いて、がんばってみて下さい。
あと、元々あったバグの一部は簡単に取れるのでそのまま残してます。
C++
1#include <stdio.h>
2#include <memory.h>
3
4int main()
5{
6 int Np;
7 printf("何人?>>>"); scanf_s("%d", &Np);
8 while(getchar() != '\n')
9 {
10 }
11
12 struct prof
13 {
14 char name[25];
15 char job[25];
16 char sex[10];
17 char age[10];
18 };
19
20 struct prof* persons=(struct prof*)malloc((sizeof(struct prof)-1)*Np);
21
22 for (int i=0; i < Np; ++i)
23 {
24 printf("名前は?>>>"); gets_s(persons[i].name, sizeof(persons[i].name));
25 printf("職業は?>>>"); gets_s(persons[i].job, sizeof(persons[i].job));
26 printf("性別は?>>>"); gets_s(persons[i].sex, sizeof(persons[i].sex));
27 printf("年齢は?>>>"); gets_s(persons[i].age, sizeof(persons[i].age));
28 }
29
30 for (int i=0; i < Np; ++i)
31 {
32 printf("%d人目の名前は%s", Np, persons[i].name);
33 printf("%d人目の職業は%s", Np, persons[i].job);
34 printf("%d人目の性別は%s", Np, persons[i].sex);
35 printf("%d人目の年齢は%s", Np, persons[i].age);
36 }
37
38 free(persons);
39
40 return 0;
41}
while(getchar() != '\n') { }
については一度コメントアウトして動きを見てみて下さい。
コンソールからの入力は、通常1行単位でバッファリングされます。
つまり、Enterキーを押して初めてユーザ・プログラムへ渡されます。
従って、1とEnterを押した場合、'1'という文字とEnter文字('\n')の計2文字が渡されます。
scan_s()で'1'は読み取られるのですが、'\n'はバッファに残ってます。これらの余分な文字を捨ててます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/12/17 21:00
退会済みユーザー
2015/12/21 09:57