繁体   English   中英

将相同的字符串存储在两种不同的结构类型中

[英]Store the same string in two different struct types

我正在研究结构,需要在char数组中分配一个字符串。 这是我代码中一些特殊的部分:

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部分。 我应该使用指针吗? 我怎么解决这个问题 ?

大概,COURSE_SIZE定义为学生可以参加的最大课程数。 然后在student_t结构中,将courses声明为char courses[COURSE_SIZE][COURSE_NAME_SIZE] ,并将其设置为strcpy(studentProfile.courses[i], courseDetails.course_name); 但这仍然不是正确的方法。 您真正想要的是将courses数组设置为courses数组:

course_t *courses[COURSE_SIZE];

并设置课程[i]指向课程j:

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

那么,如果您想参考该学生选择的第i门课程的名称,则可以使用courses[i]->course_name

注意,在声明student_t结构之前,必须先声明course_t结构。

您需要使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

由于您不使用指针,因此应使用类似

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

编辑:正如评论所指出的,这显然是错误的。

也许您只是忘记了对另一个变量的数组访问,例如

courseDetails.course_name[i]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM