在 C 问题中使用数组、指针和结构存储数据



最近几天我一直在尝试解决这个问题,但我仍然无法弄清楚......作为新手学习者。

我知道我想使用数组、指针或结构,我试图应用于它但失败了......

为代码中的一些韩语道歉。

我正在尝试做的是存储每个学生信息,以便在最后进行排序和打印 (见下图( 结果假设看起来像这样

我无法弄清楚的是存储数据并在最后打印所有学生数据(3名学生( 我尝试存储的数据是(姓名,全年,月份,日期,闰年,国籍,性别,专业(具有此顺序 我尝试使用指针,数组,但不能很好地完成。

任何建议将不胜感激,提前感谢。 请理解英语不是我的第一语言,我是编程新手,所以如果我的描述还不够,我稍后会尝试添加更多内容,请随时发表评论。 谢谢!

这是我的代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
int i;
for (i = 0; i < 3; i++)
{
char name[20];
char major[50];
char ssn[20];
printf("%s", "이름 : ");
scanf("%[^n]%*c", name);
//fgets(name, 20, stdin);
printf("%s", "학과 : ");
scanf("%[^n]%*c", major);
//fgets(major, 50, stdin);
printf("%s", "주민등록번호 : ");
//fgets(ssn, 20, stdin);
scanf("%[^n]%*c", ssn);
// last 2 digits of birth year
char year[3];
memcpy(year, &ssn[0], 2);
year[2] = '';
// 2 digits of birth month
char month[3];
memcpy(month, &ssn[2], 2);
month[2] = '';
// 2 digits of birth day
char day[3];
memcpy(day, &ssn[4], 2);
day[2] = '';
// distinguising birth years of 1900
char fullyear[5];
if ((ssn[6] == '1') || (ssn[6] == '2') || (ssn[6] == '5') || (ssn[6] == '6'))
{
fullyear[0] = '1';
fullyear[1] = '9';
fullyear[2] = year[0];
fullyear[3] = year[1];
fullyear[4] = '';
}
// distinguishing birth years of 2000
if ((ssn[6] == '3') || (ssn[6] == '4') || (ssn[6] == '7') || (ssn[6] == '8'))
{
fullyear[0] = '2';
fullyear[1] = '0';
fullyear[2] = year[0];
fullyear[3] = year[1];
fullyear[4] = '';
}
// distinguishing birth years of 1800
if ((ssn[6] == '9') || (ssn[6] == '0'))
{
fullyear[0] = '1';
fullyear[1] = '8';
fullyear[2] = year[0];
fullyear[3] = year[1];
fullyear[4] = '';
}
// print name
printf("%s, ", name);
// print birth year
printf("%s년 ", fullyear);
// print month
printf("%s월 ", month);
// print day
printf("%s일, ", day);
// leap year, converting from full year string --> int
int leapyear;
leapyear = atoi(fullyear);
if (((leapyear % 4 == 0) && (leapyear % 100 != 0)) || (leapyear % 400 == 0))
{
printf("윤년, ");
}
else
{
printf("윤년아님, ");
}
// foreigner or Korean
if ((ssn[6] == '5') || (ssn[6] == '6') || (ssn[6] == '7') || (ssn[6] == '8'))
printf("외국, ");
else printf("대한민국, ");
// gender
if ((ssn[6] == '1') || (ssn[6] == '3') || (ssn[6] == '5') || (ssn[6] == '7') || (ssn[6] == '9'))
printf("남자, ");
else printf("여자, ");
// print major
printf("%snn", major);
}
return 0;
}

正如你所说,你需要使用结构。例如,如果你想存储 3 个人(名字、姓氏和年龄(,你需要做这样的事情:

typedef struct {
char name[20];
char surname[20];
int age;
} People;
int main() {
People people[3];
int x;
for (x = 0; x < 3; x++) {
scanf("%[^n]%*c", people[x].name);
scanf("%[^n]%*c", people[x].surname);
scanf("%d%*c", &people[x].age);
}
return 0;
}

另外,请记住,如果用户在姓名/姓氏上输入超过 19 个字符,将导致溢出。fgets()加上某种控制会更好(或其他功能(,但我想这只是一种练习。

举个例子:

char txt[20];
char next;
scanf("%19[^n]%c", txt, &next);
if (next == 'n') {
printf("[*] %sn", txt);
}
else {
printf("[e] Error, >19 charactersn");
}

做你想做的事最简单、最直接的方法是使用一个(足够大的(结构数组

#include <stdio.h>
struct Student {
char name[200]; // maximum name of each student is 199
int year, month, day;
char nationality[100]; // max 99
char gender[2];
char major[100]; // max 99
};
int byage(const void *aa, const void *bb) {
const struct Student *a = aa;
const struct Student *b = bb;
if (a->year != b->year) return b->year - a->year;
if (a->month != b->month) return b->month - a->month;
return b->day - a->day;
}
int main(void) {
struct Student data[500]; // maximum 500 students
int n = data_fill(data); // fill data with user input
qsort(data, n, sizeof *data, byage); // sort data
data_print(data, n); // print it
return 0;
}

最新更新