Храните одну и ту же строку в двух разных типах структур - PullRequest
1 голос
/ 14 марта 2019

Я работаю со структурами, и мне нужно назначить строку в массиве символов. Вот мои некоторые специфические части моего кода:

typedef struct{
    int std_id;
    char std_name[STD_NAME_SIZE];
    double gpa;
    char courses[COURSE_SIZE];
}student_t;

typedef struct{
    int course_id;
    char course_name[COURSE_NAME_SIZE];
    char course_code[COURSE_CODE_SIZE];
    char course_acronym[COURSE_ACRONYM_SIZE];
    int quota;
}course_t;

это структура, которую я использую. и это часть задания:

for(int i = 0; i < COURSE_SIZE; i++){
        printf("Enter course name: ");
        scanf("%s", &courseDetails.course_name);
        studentProfile.courses[i] = courseDetails.course_name;

    }

    for(int j = 0; j < COURSE_SIZE; j++){
        printf("\nYour %d course is: %s", j + 1, studentProfile.courses[j]);
    }

Я думаю, что проблема возникает на studentProfile.courses[i] = courseDetails.course_name части. Должен ли я использовать указатели? Как я могу решить эту проблему?

Ответы [ 3 ]

0 голосов
/ 14 марта 2019

Предположительно, COURSE_SIZE определяется как максимальное количество курсов, которые может пройти студент. Тогда в структуре student_t courses будет объявлено как char courses[COURSE_SIZE][COURSE_NAME_SIZE] и будет установлено как strcpy(studentProfile.courses[i], courseDetails.course_name); Но это все еще не правильный способ сделать это. Что вам действительно нужно, так это массив courses, который будет массивом курсов:

course_t *courses[COURSE_SIZE];

и установите курсы [i] так, чтобы они указывали на курс j:

studentProfile.courses[i] = &courseDetails[j]; 

тогда, если вы хотите сослаться на название i-го курса, пройденного этим студентом, вы должны использовать courses[i]->course_name.

Обратите внимание, что вам придется объявить структуру course_t, прежде чем объявлять структуру student_t.

0 голосов
/ 14 марта 2019

Вам нужно сделать поле courses массивом указателей на char. Кроме того, courseDetails должен быть массивом:

#include <stdio.h>
#include <stdlib.h>

#define STD_NAME_SIZE       81
#define COURSE_SIZE         3
#define COURSE_NAME_SIZE    81
#define COURSE_CODE_SIZE    81
#define COURSE_ACRONYM_SIZE 81

typedef struct {
    int     std_id;
    char    std_name[STD_NAME_SIZE];
    double  gpa;
    char    *courses[COURSE_SIZE]; // Make this an array of pointers
} student_t;

typedef struct{
    int     course_id;
    char    course_name[COURSE_NAME_SIZE];
    char    course_code[COURSE_CODE_SIZE];
    char    course_acronym[COURSE_ACRONYM_SIZE];
    int     quota;
} course_t;

int main(void)
{
    student_t   studentProfile;
    course_t    courseDetails[COURSE_SIZE];

    for (int i = 0; i < COURSE_SIZE; i++){
        printf("Enter course name: ");
        scanf("%s", courseDetails[i].course_name);
        studentProfile.courses[i] = courseDetails[i].course_name;
    }

    printf("\n");
    for (int j = 0; j < COURSE_SIZE; j++){
        printf("Your %d course is: %s\n", j + 1, studentProfile.courses[j]);
    }

    return 0;
}

Составлено с

gcc -Wall -Werror -o scratch scratch.c

Пример ввода и вывода

Enter course name: first
Enter course name: second
Enter course name: third

Your 1 course is: first
Your 2 course is: second
Your 3 course is: third

Примечание

Этот подход очень хрупкий, поскольку строковые указатели в studentProfile указывают на строки, хранящиеся в других переменных. Я понимаю, что это игрушечная программа, которая является частью какой-то домашней программы. Тем не менее, я просто хочу предостеречь любого от использования этого кода в производственной среде. В реальной программе вы, вероятно, просто сохранили бы массив course_id значений в student_t. Чтобы получить название курса, вы сначала найдете course_t с соответствующим course_id, а затем отобразите course_name.

0 голосов
/ 14 марта 2019

Поскольку вы используете не указатели, вы должны использовать что-то вроде

strcpy(studentProfile.courses[i], courseDetails.course_name);

EDIT: это явно неправильно, как отмечается в комментарии.

возможно, вы просто забыли доступ к массиву для другой переменной, как в

courseDetails.course_name[i]
...