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

时间:2020-05-19 07:57:18

标签: c arrays pointers struct

最近几天我一直在努力解决这个问题,但是我还是不知道...作为一个新手学习者。

我了解我想使用数组,指针或结构,但尝试将其应用于应用程序但失败了...

向代码中的某些韩语致歉。

我想做的是存储每个学生信息,以便最后进行排序和打印 (见下图) result suppose to look like this

我不知道的是存储数据并最后打印所有学生数据(3个学生) 我尝试按此顺序存储的数据(姓名,年份,月份,日期,leap年,国籍,性别,专业) 我尝试使用指针,数组,但是做得不好。

任何建议将不胜感激,并在此先感谢。 请理解英语不是我的母语,并且我是编程的新手,所以如果我的母语不够,我将在以后尝试添加更多内容,以便随时发表评论。 谢谢!

这是我的代码:

#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] = '\0';

        // 2 digits of birth month
        char month[3];
        memcpy(month, &ssn[2], 2);
        month[2] = '\0';

        // 2 digits of birth day
        char day[3];
        memcpy(day, &ssn[4], 2);
        day[2] = '\0';

        // 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] = '\0';
        }

        // 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] = '\0';
        }

        // 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] = '\0';
        }

        // 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("%s\n\n", major);
    }
    return 0;
}

2 个答案:

答案 0 :(得分: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("[*] %s\n", txt);
}
else {
  printf("[e] Error, >19 characters\n");
}

答案 1 :(得分:0)

最简单,最直接的方法是(足够大的)结构数组

#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;
}