問題は...
構造体を要素型とする配列を使用して登録された学生のデータ(名前、身長、体重、奨学金)を、身長もしくは名前の昇順でソートするプログラムを作成せよ、なお、名前や身長などのデータは初期化子として与えず、キーボードから読み込むこと。
というものです。
試行錯誤した結果、以下のようなコードになりました。
#include<stdio.h>
#include<string.h>
#define NUMBER 2 /*-学生の人数-*/
#define NAME_LEN 64 /*-名前の文字数-*/
/*---学生を表す構造体---*/
typedef struct{
char name[NAME_LEN];
int height;
float weight;
long schols;
}Student;
/*---xおよびyが指す学生を交換---*/
void swap_Student(Student *x, Student *y)
{
Student temp = *x;
*x = *y;
*y = temp;
}
/*---学生の配列aの先頭n個の要素を身長の昇順にソート*/
void sort_by_height(Student a[], int n)
{
int i, j;
for (i = 0; i < n; i++){
for (j = n; j >= i; j--){
if (a[j - 1].height > a[j].height){
swap_Student(&a[j - 1], &a[j]);
}
}
}
}
/*---名前の昇順にソート---*/
void sort_by_name(Student a[], int n)
{
int i, j;
for (i = 0; i < n; i++){
for (j = n; j >= i; j--){
if (strcmp(a[j].name, a[j - 1].name)>0){
swap_Student(&a[j - 1], &a[j]);
}
}
}
}
int main(void)
{
int i, j = 1;
int c;
Student std[NUMBER];
for (i = 0; i < NUMBER; i++){
printf("%d人目\n名前:", j); scanf("%s", std[i].name);
printf("身長:"); scanf("%d", &std[i].height);
printf("体重:"); scanf("%f", &std[i].weight);
printf("奨学金:"); scanf("%ld", &std[i].schols);
j = j + 1;
}
for (i = 0; i < NUMBER; i++){
printf("%-8s %6d %6.1f %7ld\n",
std[i].name, std[i].height, std[i].weight, std[i].schols);
}
printf("身長昇順でソート:[0]入力\n名前順でソート:[1]入力\n");
scanf("%d", &c);
if (c == 0){
sort_by_height(std, NUMBER);
puts("\nソートした\n");
for (i = 0; i < NUMBER; i++){
printf("%-8s %6d %6.1f %7ld\n",
std[i].name, std[i].height, std[i].weight, std[i].schols);
}
}else if (c == 1){
sort_by_name(std, NUMBER);
puts("\nソートした\n");
for (i = 0; i < NUMBER; i++){
printf("%-8s %6d %6.1f %7ld\n",
std[i].name, std[i].height, std[i].weight, std[i].schols);
}
}else{
printf("ソートしません\n");
}
return 0;
}
"身長昇順でソート:[0]入力\n名前順でソート:[1]入力"というところで、0,1どちらを入力しても、
Stack around the variable 'std' was corrupted.
というエラーが出てしまいます。
このエラーについてや、その他おかしい箇所がありましたらご指摘やご教授をいただければ幸いです。
長文失礼しましたm(__)m