问题:输入字符串后出现死循环

问题:输入字符串后出现死循环:
学生成绩管理系统,“Search_by_name”函数中:

    printf("请输入目标学生姓名:");
    scanf("%s",xingming);

一部分,输入任意字符串(如“gfds""bgfdx")会出现死循环,循环出现菜单界面(循环调用caidan()函数),但输入数字运行正常。
为保证提问可读性,已略去无关函数。
麻烦各位指正,非常感谢!
(使用编程软件:DEV-C++,系统win11)
源代码:


#include
#include<string.h>
#include 


    //变量区
    //定义结构体:
    typedef struct student
    {
        char name[30];  //名字 
        int xuehao;     //学号 
        int score[6];   //成绩 
        int zongfen;    //个人总分 
        int pingjunfen;  //个人平均分 
    }student;
int main()
{
    //函数声明区
    int caidan();//菜单函数 
    int Input_record(struct student stu[],int banpingjunfen[],int banzongfen[],int kemushu_xueshengshu[2]);//录入成绩 
    int Calculate_total_and_average_score_of_every_course(struct student stu[],int banpingjunfen[],int banzongfen[],int kemushu,int xueshengshu);//计算每门课程的总分和平均分
    int Calculate_total_and_average_score_of_every_student(struct student stu[],int banpingjunfen[],int banzongfen[],int kemushu,int xueshengshu);//计算每个学生的总分和平均分
    int Sort_in_descending_order_by_total_score_of_every_student(struct student stu[],struct student stu1[],int kemushu,int xueshengshu);//按每个学生的总分由高到低排出名次表;
    int Sort_in_asending_order_by_total_score_of_every_student(struct student stu[],struct student stu1[],int kemushu,int xueshengshu);//按每个学生的总分由低到高排出名次表;
    int Sort_in_ascending_order_by_number(struct student stu[],struct student stu1[],int kemushu,int xueshengshu);//按学号由小到大排出成绩表;
    int Sort_in_dictionary_order_by_name(struct student stu[],struct student stu1[],int kemushu,int xueshengshu);//按姓名的字典顺序排出成绩表;
    int Search_by_number(struct student stu[],struct student stu1[],int kemushu,int xueshengshu);//按学号查询学生排名及其各科考试成绩;
    int Search_by_name(struct student stu[],struct student stu1[],int kemushu,int xueshengshu);//按姓名查询学生排名及其各科考试成绩;
    int Statistic_analysis(struct student stu[],int kemushu,int xueshengshu);//等级统计
    int List_record(struct student stu[],int kemushu,int xueshengshu,int banzongfen[],int banpingjunfen[]);//输出每个学生的所有信息
    int Write_to_a_file(struct student stu[],int kemushu,int xueshengshu,int banzongfen[],int banpingjunfen[]);//l将每个学生的记录信息写入文件;
    int  Read_from_a_file(struct student stu[],int kemushu,int xueshengshu,int banzongfen[],int banpingjunfen[]);//从文件中读出每个学生的记录信息并显示。
    //变量设定区
    student stu[30];
    student stu1[30];
    int banpingjunfen[6];  //班平均分 
    int banzongfen[6];       //班总分 
    int kemushu_xueshengshu[2] = {0};//使得学生数、科目数能同时反出来 0位:科目数;1位:学生数 
    int moshi;
    int kemushu = 0,xueshengshu = 0;
    int c = 0;
     
    //正式使用区
    while(1)
    {
        moshi = caidan();                 //调用“菜单模块” 
        switch (moshi)
        {
            case 1:
                Input_record(stu,banpingjunfen,banzongfen,kemushu_xueshengshu);
                kemushu = kemushu_xueshengshu[0];
                xueshengshu = kemushu_xueshengshu[1];
                break;
            case 2:
                Calculate_total_and_average_score_of_every_course(stu,banpingjunfen,banzongfen,kemushu,xueshengshu);
                break;
            case 3:
                Calculate_total_and_average_score_of_every_student(stu,banpingjunfen,banzongfen,kemushu,xueshengshu);
                break;
            case 4:
                Sort_in_descending_order_by_total_score_of_every_student(stu,stu1,kemushu,xueshengshu);
                break;
            case 5:
                Sort_in_asending_order_by_total_score_of_every_student(stu,stu1,kemushu,xueshengshu);
                break;    
            case 6:
                Sort_in_ascending_order_by_number(stu,stu1,kemushu,xueshengshu);
                break;
            case 7:
                Sort_in_dictionary_order_by_name(stu,stu1,kemushu,xueshengshu);
                break;
            case 8:
                Search_by_number(stu,stu1,kemushu,xueshengshu);
                break;
            case 9:
                Search_by_name(stu,stu1,kemushu,xueshengshu); 
                c = 0;
                break;
            case 10:
                Statistic_analysis(stu,kemushu,xueshengshu);
                break;
            case 11:
                List_record(stu,kemushu,xueshengshu,banzongfen,banpingjunfen);
                break;
            case 12:
                Write_to_a_file(stu,kemushu,xueshengshu,banzongfen,banpingjunfen);
                break;    
            case 13:
                Read_from_a_file(stu,kemushu,xueshengshu,banzongfen,banpingjunfen);
                break;    
            case 0: 
                c = 1;
                break;
        }
        if(c == 1)
            break;
    } 
}

int caidan()//菜单函数 
{
    int x;//模式 
    printf("欢迎使用成绩系统,请通过输入数字选择操作:\n") ;
    printf("1. Input record\n"); 
    printf("2. Calculate total and average score of every course\n"); 
    printf("3. Calculate total and average score of every student\n"); 
    printf("4. Sort in descending order by total score of every student\n"); 
    printf("5. Sort in asending order by total score of every student\n"); 
    printf("6. Sort in ascending order by number\n"); 
    printf("7. Sort in dictionary order by name\n"); 
    printf("8. Search by number\n"); 
    printf("9. Search by name \n");
    printf("10.Statistic analysis \n");
    printf("11.List record\n");
    printf("12.Write to a file\n");
    printf("13.Read from a file\n");
    printf("0. Exit\n"); 
    printf("Please enter your choice:"); 
    scanf("%d",&x);
    return x;
}


int Search_by_name(struct student stu[],struct student stu1[],int kemushu,int xueshengshu)//按姓名查询学生排名及其各科考试成绩;
{
    //排序阶段
    Sort_in_descending_order_by_total_score_of_every_student(stu,stu1,kemushu,xueshengshu);//按每个学生的总分由高到低排出名次表;
    //输入目标姓名
    char xingming[30];
    printf("请输入目标学生姓名:");
    scanf("%s",xingming);
    //查询、输出阶段 
    int xuesheng = 0,kemu = 0,chenggong = 0;
    for(xuesheng=0;xueshengif(strcmp(xingming,stu1[xuesheng].name)==0)
        {
            printf("查询成功,学生%s的排名为%d,各科成绩分别为:\n",stu1[xuesheng].name,xuesheng+1);
            for(kemu=0;kemu"第%d科:%d分\n",kemu+1,stu1[xuesheng].score[kemu]);
            chenggong = 1;
        }
    if(chenggong == 0)
    {
        printf("查无此人,请检查输入姓名。\n");
    }

    return 0;
}

img

修改如下,供参考:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>      // 修改

//变量区
//定义结构体:
typedef struct student
{
    char name[30];  //名字 
    int xuehao;     //学号 
    int score[6];   //成绩 
    int zongfen;    //个人总分 
    int pingjunfen;  //个人平均分 
}student;

//函数声明区                                  //以下修改,函数声明,变量声明 应移动到主函数外面,作用域为全局
int caidan();//菜单函数 
int Input_record(struct student stu[], int banpingjunfen[], int banzongfen[], int kemushu_xueshengshu[2]);//录入成绩 
int Calculate_total_and_average_score_of_every_course(struct student stu[], int banpingjunfen[], int banzongfen[], int kemushu, int xueshengshu);//计算每门课程的总分和平均分
int Calculate_total_and_average_score_of_every_student(struct student stu[], int banpingjunfen[], int banzongfen[], int kemushu, int xueshengshu);//计算每个学生的总分和平均分
int Sort_in_descending_order_by_total_score_of_every_student(struct student stu[], struct student stu1[], int kemushu, int xueshengshu);//按每个学生的总分由高到低排出名次表;
int Sort_in_asending_order_by_total_score_of_every_student(struct student stu[], struct student stu1[], int kemushu, int xueshengshu);//按每个学生的总分由低到高排出名次表;
int Sort_in_ascending_order_by_number(struct student stu[], struct student stu1[], int kemushu, int xueshengshu);//按学号由小到大排出成绩表;
int Sort_in_dictionary_order_by_name(struct student stu[], struct student stu1[], int kemushu, int xueshengshu);//按姓名的字典顺序排出成绩表;
int Search_by_number(struct student stu[], struct student stu1[], int kemushu, int xueshengshu);//按学号查询学生排名及其各科考试成绩;
int Search_by_name(struct student stu[], struct student stu1[], int kemushu, int xueshengshu);//按姓名查询学生排名及其各科考试成绩;
int Statistic_analysis(struct student stu[], int kemushu, int xueshengshu);//等级统计
int List_record(struct student stu[], int kemushu, int xueshengshu, int banzongfen[], int banpingjunfen[]);//输出每个学生的所有信息
int Write_to_a_file(struct student stu[], int kemushu, int xueshengshu, int banzongfen[], int banpingjunfen[]);//l将每个学生的记录信息写入文件;
int Read_from_a_file(struct student stu[], int kemushu, int xueshengshu, int banzongfen[], int banpingjunfen[]);//从文件中读出每个学生的记录信息并显示。

//变量设定区
student stu[30];
student stu1[30];
int banpingjunfen[6];  //班平均分 
int banzongfen[6];       //班总分 
int kemushu_xueshengshu[2] = { 0 };//使得学生数、科目数能同时反出来 0位:科目数;1位:学生数 
int kemushu = 0, xueshengshu = 0;


int main()
{
    int c = 0;
    int moshi;
    //正式使用区
    while (1)
    {
        moshi = caidan();                 //调用“菜单模块” 
        switch (moshi)
        {
        case 1:
            Input_record(stu, banpingjunfen, banzongfen, kemushu_xueshengshu);
            kemushu = kemushu_xueshengshu[0];
            xueshengshu = kemushu_xueshengshu[1];
            break;
        case 2:
            Calculate_total_and_average_score_of_every_course(stu, banpingjunfen, banzongfen, kemushu, xueshengshu);
            break;
        case 3:
            Calculate_total_and_average_score_of_every_student(stu, banpingjunfen, banzongfen, kemushu, xueshengshu);
            break;
        case 4:
            Sort_in_descending_order_by_total_score_of_every_student(stu, stu1, kemushu, xueshengshu);
            break;
        case 5:
            Sort_in_asending_order_by_total_score_of_every_student(stu, stu1, kemushu, xueshengshu);
            break;
        case 6:
            Sort_in_ascending_order_by_number(stu, stu1, kemushu, xueshengshu);
            break;
        case 7:
            Sort_in_dictionary_order_by_name(stu, stu1, kemushu, xueshengshu);
            break;
        case 8:
            Search_by_number(stu, stu1, kemushu, xueshengshu);
            break;
        case 9:
            Search_by_name(stu, stu1, kemushu, xueshengshu);
            //c = 0;  此行删除
            break;
        case 10:
            Statistic_analysis(stu, kemushu, xueshengshu);
            break;
        case 11:
            List_record(stu, kemushu, xueshengshu, banzongfen, banpingjunfen);
            break;
        case 12:
            Write_to_a_file(stu, kemushu, xueshengshu, banzongfen, banpingjunfen);
            break;
        case 13:
            Read_from_a_file(stu, kemushu, xueshengshu, banzongfen, banpingjunfen);
            break;
        case 0:
            c = 1;
            break;
        }
        if (c == 1)
            break;
        printf("按任意键继续..."); // 修改
        _getch();                  // 修改
    }
}

int caidan()//菜单函数 
{
    int x;//模式 
    printf("欢迎使用成绩系统,请通过输入数字选择操作:\n");
    printf("1. Input record\n");
    printf("2. Calculate total and average score of every course\n");
    printf("3. Calculate total and average score of every student\n");
    printf("4. Sort in descending order by total score of every student\n");
    printf("5. Sort in asending order by total score of every student\n");
    printf("6. Sort in ascending order by number\n");
    printf("7. Sort in dictionary order by name\n");
    printf("8. Search by number\n");
    printf("9. Search by name \n");
    printf("10.Statistic analysis \n");
    printf("11.List record\n");
    printf("12.Write to a file\n");
    printf("13.Read from a file\n");
    printf("0. Exit\n");
    printf("Please enter your choice:");
    scanf("%d", &x);
    return x;
}


int Search_by_name(struct student stu[], struct student stu1[], int kemushu, int xueshengshu)//按姓名查询学生排名及其各科考试成绩;
{
    //排序阶段
    //Sort_in_descending_order_by_total_score_of_every_student(stu, stu1, kemushu, xueshengshu);//按每个学生的总分由高到低排出名次表;
    //输入目标姓名
    char xingming[30];
    printf("请输入目标学生姓名:");
    scanf("%s", xingming);
    //查询、输出阶段 
    int xuesheng = 0, kemu = 0, chenggong = 0;
    for (xuesheng = 0; xuesheng < xueshengshu; xuesheng++)
        if (strcmp(xingming, stu1[xuesheng].name) == 0)
        {
            printf("查询成功,学生%s的排名为%d,各科成绩分别为:\n", stu1[xuesheng].name, xuesheng + 1);
            for (kemu = 0; kemu < kemushu; kemu++)
                printf("第%d科:%d分\n", kemu + 1, stu1[xuesheng].score[kemu]);
            chenggong = 1;
        }
    if (chenggong == 0)
    {
        printf("查无此人,请检查输入姓名。\n");
    }

    return 0;
}

caidan输入前先清一下输入缓存,fflush(stdin)

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    从问题描述中我们可以看到,学生成绩管理系统中的 "Search_by_name" 函数在输入任意字符串时会导致死循环,而输入数字则正常运行。这种情况可能是由于以下几个原因造成的:

    1. 程序设计上逻辑错误,导致程序进入死循环;
    2. 输入字符串时,没有正确限制输入格式,从而导致程序进入死循环;
    3. 编程软件存在BUG,导致程序运行时出现异常。

    为了解决这个问题,我们可以尝试以下几个步骤:

    第一步:检查程序代码,确认是否存在逻辑错误。 从问题描述中,我们可以看到只有在输入字符串时会出现死循环,因此我们可以检查代码中输入字符串时的相关逻辑是否有误。下面是一个例子:

    void Search_by_name(){
        string name;
        cout<<"Enter student name you want to search: ";
        cin>>name;
    
        for(int i=0; i<stuNum; i++){
            if(students[i].name==name){
                display_student(students[i]);
                return;
            }
        }
        cout<<"Not found!"<<endl;
    }
    

    通过检查上面的代码,可以发现程序在输入字符串时没有进行格式检查,因此当输入一个字符串时,程序会一直在 for 循环中无限循环。解决此问题的一种方法是在输入前添加一个循环,当输入不是字母时才进行 for 循环,否则提示输入有误并重新输入。下面是代码:

    void Search_by_name(){
        string name;
        cout<<"Enter student name you want to search: ";
        cin>>name;
    
        // 判断输入的是否都是字母
        while (!isalpha(name[0]))
        {
            cout << "Please enter a name with alphabetical characters" << endl;
            cin >> name;
        }
    
        for(int i=0; i<stuNum; i++){
            if(students[i].name==name){
                display_student(students[i]);
                return;
            }
        }
        cout<<"Not found!"<<endl;
    }
    

    第二步:检查输入格式,确认输入是否合法。 在第一步中,我们已经通过添加循环来避免了输入非字母字符的问题,但是输入的字符串是否有特殊字符,比如换行符、制表符等,也会影响程序的运行,因此我们需要进一步添加正则表达式来判断输入是否合法。下面是一个例子:

    void Search_by_name(){
        string name;
        cout<<"Enter student name you want to search: ";
        cin>>name;
    
        // 判断输入的是否都是字母
        while (!regex_match(name, std::regex("[A-Za-z]+")))
        {
            cout << "Please enter a name with alphabetical characters" << endl;
            cin >> name;
        }
    
        for(int i=0; i<stuNum; i++){
            if(students[i].name==name){
                display_student(students[i]);
                return;
            }
        }
        cout<<"Not found!"<<endl;
    }
    

    第三步:确认编程软件是否存在BUG。 上面两个步骤都是基于程序的逻辑和输入格式处理,如果仍然存在死循环的问题,那么就需要考虑编程软件是否存在BUG,可以尝试换用其他编程软件。

    综上所述,解决这个问题的关键在于理解代码中逻辑和输入格式的处理,并进行相应的优化。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

你的case 9 里面不是把c = 0; 自然就跳不出while(1)的循环。