C 如何打印结构的字段

C 如何打印结构的字段,c,linked-list,C,Linked List,我正在尝试用C打印结构的字段,但遇到了问题。 我有两个问题 首先,当我试图打印名为“math”的课程的字段“courseName”时,我得到:“(null)math══════════════════════════" 其次,当我试图打印字段courseNumber时,它会打印courseNumber和courseName。 有人能告诉我我做错了什么吗 struct Course { char courseNumber[6]; char courseName[30]; s

我正在尝试用C打印结构的字段,但遇到了问题。 我有两个问题

首先,当我试图打印名为“math”的课程的字段“courseName”时,我得到:“(null)math══════════════════════════"

其次,当我试图打印字段courseNumber时,它会打印courseNumber和courseName。 有人能告诉我我做错了什么吗

struct Course {
    char courseNumber[6];
    char courseName[30];
    struct Course* next;
};

struct Course* updateCoursesList(char courseDetails[], struct Course* coursesList)
{
    struct Course* head = NULL;
    int i = 6, j = 0;
    if (coursesList == NULL) {
        coursesList = (struct Course*)malloc(sizeof(struct Course));
        if (coursesList == NULL)
            return NULL;
        head = coursesList;
        strncpy(coursesList->courseNumber, courseDetails, 5);
        coursesList->next = NULL;
        while (courseDetails[i] != '\n') {
            coursesList->courseName[j] = courseDetails[i];
            i++;
            j++;
        }
    }
    else {
        head = coursesList;
        if (strncmp(courseDetails, coursesList->courseNumber, 5) == 0) {
            while (courseDetails[i] != '\n') {
                coursesList->courseName[j] = courseDetails[i];
                i++;
                j++;
            }
            return head;
        }
        while (coursesList->next != NULL) {
            if (strncmp(courseDetails, coursesList->courseNumber, 5) == 0) {
                while (courseDetails[i] != '\n') {
                    coursesList->courseName[j] = courseDetails[i];
                    i++;
                    j++;
                }
                return head;
            }
            else
                coursesList = coursesList->next;
        }
        coursesList->next = (struct Course*)malloc(sizeof(struct Course));
        if (coursesList->next == NULL)
            return head;
        strncpy(coursesList->next->courseNumber, courseDetails, 5);
        coursesList->next->next = NULL;
        while (courseDetails[i] != '\n') {
            coursesList->next->courseName[j] = courseDetails[i];
            i++;
            j++;
        }
    }
    return head;
}

int main()
{
    struct Course* coursesList = NULL;
    char array[30] = "12345 math\n";
    coursesList = updateCoursesList(array, coursesList);
    printf("%s", coursesList->courseNumber);
    printf("%s", coursesList->courseName);
}

实际上,您可以使用
strncpy
来复制
courseNumber
courseName
,因为两者都是字符串

strncpy
不会使用
\0
终止符终止复制的字符串,因此我们在末尾添加了
\0

对于您的输入
char数组[30]=“12345 math\n”
请执行以下操作

strncpy(coursesList->courseNumber, courseDetails, 5);
coursesList->courseNumber[5] = '\0';
//since your courseName is also string, you need not do piece by piece copy
strncpy(coursesList->courseName, courseDetails+6, 5);
coursesList->courseName[5] = '\0';

if
else
两部分中都不需要以下代码

while (courseDetails[i] != '\n')
{
    coursesList->courseName[j] = courseDetails[i];
    i++;
    j++;
}

注意:但是这种非常奇怪的读取输入的方式,取而代之的是从
stdin
获取输入并使用它们,因为所有课程的长度可能不同。

在C中,字符串需要以NUL结尾。
strncpy(coursesList->courseNumber,courseDetails,5);
这不会导致以NUL结尾的字符串。需要类似于
coursesList->courseNumber[5]='\0';
未定义的越界访问行为。@kaylum谢谢你。它解决了我的两个问题。