c语言程序报错了打印学生信息出问题

程序运行报错了。是打印学生信息问题,可以帮忙看看如何修改吗

#include<stdio.h>
#include<stdlib.h>
void menu();       //主界面
void inputstudent();//录入学生信息
void printstudent();//打印学生信息
typedef struct _student   //定义学生  
{
    char name[30];//姓名
    int age;//年龄
    int xuehao;//学号
    int score;//分数
}student;
//结点
typedef struct _Node
{
    student stu;   //学生
    struct _Node* pNext;//指向下一个结点的指针
}Node;
Node *g_pHead=NULL;//头结点
int main()
{
    int ch;
    while (1)
    {
     menu();
    scanf("%d",&ch);       //输入所需数字
    switch(ch)
    {
    case 1://录入学生信息    
        inputstudent();
        break;
    case 2://打印学生信息
        printstudent();
        break;
    case 3://保存学生信息
        break;
    case 4://读取学生信息
        break;
    case 5://查找学生信息
        break;
    case 6://修改学生信息
        break;
    case 7://删除学生信息
        break;
    case 8://统计学生人数
        break;
    case 9://退出系统
        break;
    default:
        printf("请重新输入\n");
        break;
         }
    }
    return 0;
}

//主界面
void  menu()
{
    printf("**************************************************\n");
    printf("*         西安工程大学成绩管理系统v6.6           *\n");
    printf("**************************************************\n");
    printf("*         欢迎使用,请输入对应功能序号           *\n");
    printf("**************************************************\n");
    printf("*                1.录入学生信息                  *\n");
    printf("*                2.打印学生信息                  *\n");
    printf("*                3.保存学生信息                  *\n");
    printf("*                4.读取学生信息                  *\n");
    printf("*                5.查找学生信息                  *\n");
    printf("*                6.修改学生信息                  *\n");
    printf("*                7.删除学生信息                  *\n");
    printf("*                8.统计学生人数                  *\n");
    printf("*                9.退出系统                      *\n");
    printf("**************************************************\n");
}
void inputstudent()//录入学生信息
{
        //创建一个新节点
        Node *pNewNode=(Node*)malloc(sizeof(Node));
        pNewNode->pNext = NULL;
        //头插法
        if(g_pHead==NULL)
        {
            g_pHead = pNewNode;
        }
        else
        {
            pNewNode->pNext = g_pHead;
            g_pHead = pNewNode;
        }
        printf("请输入学生姓名:\n"); 
        scanf("%s",pNewNode->stu.name);
        printf("请输入学生年龄;\n");
        scanf("%d",&pNewNode->stu.age);
        printf("请输入学生学号:\n"); 
        scanf("%d",&pNewNode->stu.xuehao);
        printf("请输入学生成绩:\n"); 
        scanf("%d",&pNewNode->stu.score);
        printf("学生信息录入成功;\n");
        system("pause");             //暂停
        system("cls");                 //清屏
}
void printstudent()//打印学生信息
{
    printf("**************************************************\n");
    printf("*         西安工程大学成绩管理系统v6.6           *\n");
    printf("**************************************************\n");
    printf("*\t学号\t*\t姓名\t*\t年龄\t*\t成绩*\n");
    printf("**************************************************\n");
    //遍历链表
    Node*p=g_pHead;
    while(p!=NULL)
    {
        printf("*\t%d\t*\t%s\t*\t%d\t*\t%d*\n",
            p->stu.xuehao,
            p->stu.name,
            p->stu.age,
            p->stu.score);
        p=p->pNext;
    }        
    }

错误信息

img

看起来你的代码是一个链表程序,它实现了存储学生信息的功能。在这里,我们只需要关注打印学生信息的部分即可。

根据你的代码,在 "void printstudent()" 函数中没有任何打印学生信息的代码。这可能就是为什么程序运行报错了的原因。

为了正确打印学生信息,你需要在 "void printstudent()" 函数中编写遍历链表并打印学生信息的代码。可以使用一个循环来遍历链表中的每一个结点,然后使用 "printf()" 函数来打印学生的姓名,年龄,学号和分数。

下面是一个示例代码,它可以帮助实现打印学生信息的功能:

void printstudent()
{
    Node* pNode = g_pHead;//从链表头开始遍历

    while (pNode != NULL)
    {
        printf("姓名: %s\n", pNode->stu.name);
        printf("年龄: %d\n", pNode->stu.age);
        printf("学号: %d\n", pNode->stu.xuehao);
        printf("分数: %d\n", pNode->stu.score);
        printf("\n");
        pNode = pNode->pNext;
    }
}

你可以将这些代码添加到你的 "void printstudent()" 函数中。最后,确保在录入学生信息时正确地插入结点到链表中。

还有另外两点要注意:
1.在 switch 中的所有 case 后面都应该有 break,否则程序会继续往下执行,可能会导致意想不到的结果。
2.在使用 scanf() 函数输入数据时要注意是否有输入错误或者输入了不符合要求的数据,这可以使用 if(scanf("%d", &ch) != 1) 进行检测。
这是更新后的完整程序,修改了打印学生信息的部分并加入了必要的检测:

#include<stdio.h>
#include<stdlib.h>
void menu();       //主界面
void inputstudent();//录入学生信息
void printstudent();//打印学生信息
typedef struct _student   //定义学生  
{
    char name[30];//姓名
    int age;//年龄
    int xuehao;//学号
    int score;//分数
}student;
//结点
typedef struct _Node
{
    student stu;   //学生
    struct _Node* pNext;//指向下一个结点的指针
}Node;
Node *g_pHead=NULL;//头结点
int main()
{
    int ch;
    while (1)
    {
     menu();
    if(scanf("%d", &ch) != 1){
        printf("请输入数字\n");
        continue;
    }
    switch(ch)
    {
    case 1://录入学生信息    
        inputstudent();
        break;
    case 2://打印学生信息
        printstudent();
        break;
    case 3://保存学生信息
        break;
    case 4://读取学生信息
        break;
    case 5://查找学生信息
        break;
    case 6://修改学生信息
        break;
    case 7://删除学生信息
        break;
    case 8://统计学生人数
        break;
    case 9://退出系统
        return 0;
        break;
    default:
        printf("请重新输入\n");
        break;
         }
    }
    return 0;
}
//主界面
void  menu()
{
    printf("**************************************************\n");
    printf("*         西安工程大学成绩管理系统v6.6           *\n");
    printf("**************************************************\n");
    printf("*         欢迎使用,请输入对应功能序号           *\n");
    printf("**************************************************\n");
    printf("*                1.录入学生信息 \n");
printf(" 2.打印学生信息 \n");
printf(" 3.保存学生信息 \n");
printf(" 4.读取学生信息 \n");
printf(" 5.查找学生信息 \n");
printf(" 6.修改学生信息 \n");
printf(" 7.删除学生信息 \n");
printf(" 8.统计学生人数 \n");
printf(" 9.退出系统 *\n");
printf("**************************************************\n");
}

void inputstudent()//录入学生信息{
Node* pNode = (Node*)malloc(sizeof(Node));//分配空间
printf("请输入学生姓名:");
scanf("%s", pNode->stu.name);
printf("请输入学生年龄:");
scanf("%d", &pNode->stu.age);
printf("请输入学生学号:");
scanf("%d", &pNode->stu.xuehao);
printf("请输入学生分数:");
scanf("%d", &pNode->stu.score);
pNode->pNext = g_pHead;
g_pHead = pNode;
}

void printstudent()
{
Node* pNode = g_pHead;//从链表头开始遍历while (pNode != NULL)
{
    printf("姓名: %s\n", pNode->stu.name);
    printf("年龄: %d\n", pNode->stu.age);
    printf("学号: %d\n", pNode->stu.xuehao);
    printf("分数: %d\n", pNode->stu.score);
    printf("\n");
    pNode = pNode->pNext;
}}

这段代码中已经考虑了输入错误的情况,在 case 9 中设置了退出程序。而且修改了 printstudent() 中遍历链表并打印学生信息的部分。

现在您可以编译并运行这个程序,看看是否能运行。

错误信息贴出来。
gcc12,vc2022运行正常

img

错误信息已贴

img

这个错误提示,不在上面的代码里。

没什么问题,被我删减了些代码

小改动了

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

void menu();         //主界面
void inputstudent(); //录入学生信息
void printstudent(); //打印学生信息

typedef struct _student //定义学生
{
    char name[30]; //姓名
    int age;       //年龄
    int xuehao;       //学号
    int score;       //分数
} student;

//结点
typedef struct _Node
{
    student stu;         //学生
    struct _Node *pNext; //指向下一个结点的指针
} Node;

Node *g_pHead = NULL; //头结点

int main()
{
    int ch;
    while (1)
    {
        menu();
        scanf("%d", &ch); //输入所需数字
        switch (ch)
        {
        case 1: //录入学生信息
            inputstudent();
            break;
        case 2: //打印学生信息
            printstudent();
            break;
        case 3: //保存学生信息
            break;
        case 4: //读取学生信息
            break;
        case 5: //查找学生信息
            break;
        case 6: //修改学生信息
            break;
        case 7: //删除学生信息
            break;
        case 8: //统计学生人数
            break;
        case 9: //退出系统
            break;
        default:
            printf("请重新输入\n");
            getchar();
            getchar();
            break;
        }

        //system("pause"); //暂停
        getchar();
        getchar();

        system("cls"); //清屏
    }
    return 0;
}
//主界面
void menu()
{
    printf("\n**************************************************\n");
    printf("*         西安工程大学成绩管理系统v6.6           *\n");
    printf("**************************************************\n");
    printf("*         欢迎使用,请输入对应功能序号           *\n");
    printf("**************************************************\n");
    printf("*                1.录入学生信息                  *\n");
    printf("*                2.打印学生信息                  *\n");
    printf("*                3.保存学生信息                  *\n");
    printf("*                4.读取学生信息                  *\n");
    printf("*                5.查找学生信息                  *\n");
    printf("*                6.修改学生信息                  *\n");
    printf("*                7.删除学生信息                  *\n");
    printf("*                8.统计学生人数                  *\n");
    printf("*                9.退出系统                      *\n");
    printf("**************************************************\n");
}
void inputstudent() //录入学生信息
{
    //创建一个新节点
    Node *pNewNode = (Node *)malloc(sizeof(Node));

    //头插法
    /*
    这些可以不要因为头指针为空下面两行同样能满足要求的
    pNewNode->pNext = NULL;
    if (g_pHead == NULL)
    {
        g_pHead = pNewNode;
    }
    else
    {
        pNewNode->pNext = g_pHead;
        g_pHead = pNewNode;
    }
    */

    pNewNode->pNext = g_pHead;
    g_pHead = pNewNode;

    printf("请输入学生姓名:\n");
    scanf("%s", pNewNode->stu.name);
    printf("请输入学生年龄;\n");
    scanf("%d", &pNewNode->stu.age);
    printf("请输入学生学号:\n");
    scanf("%d", &pNewNode->stu.xuehao);
    printf("请输入学生成绩:\n");
    scanf("%d", &pNewNode->stu.score);
    printf("学生信息录入成功;\n");
}

void printstudent() //打印学生信息
{
    puts("\n");
    printf("**************************************************\n");
    printf("*         西安工程大学成绩管理系统v6.6           *\n");
    printf("**************************************************\n");
    printf("*\t学号\t*\t姓名\t*\t年龄\t*\t成绩*\n");
    printf("**************************************************\n\n");
    //遍历链表
    Node *p = g_pHead;
    while (p != NULL)
    {
        printf("*\t%d\t*\t%s\t*\t%d\t*\t%d*\n",
               p->stu.xuehao,
               p->stu.name,
               p->stu.age,
               p->stu.score);
        p = p->pNext;
    }
}