函数建立成功,但主函数运行调用失败

问题遇到的现象和发生背景
代码编译以后无错误,但运行到一半就无法调用后面的两个查找函数。

问题相关代码,

#include <stdio.h>
#include <stdlib.h>
#include<algorithm>
#include<string.h>
struct Student {                                   //定义结构体类型Student
    int num;
    char name[20];
    float score;
};
void input(Student* st, int n);                    //定义输入函数
void print(Student* st, int n);                    //定义输出函数
void sort(Student* st, int n);                     //定义排序函数
void find_EFF(Student* st, int n);                 //定义二分法查找函数
void find_SX(Student* st, int n);                  //定义顺序查找函数
int main()
{
    Student* stu;                                  //定义结构体指针stu
    int n;
    printf("请输入学生总人数: ");                  //输入学生个数
    scanf("%d", &n);
    stu = (Student*)malloc(n * sizeof(Student));   //为stu分配内存空间
    input(stu, n);                                 //调用输入函数
    sort(stu, n);                                  //调用排序函数
    print(stu, n);                                 //调用输出函数
    find_EFF(stu, n);
    find_SX(stu, n);
    system("pause");
    return 0;
}
//输入函数
void input(Student* st, int n)
{
    int i;
    for (i = 0; i < n; i++) {
        printf("请填写 No.%d 学生信息: ", i + 1);
        scanf("%d %s %f", &st[i].num, st[i].name, &st[i].score);
    }
}
//输出函数
void print(Student* st, int n)
{
    Student* p;
    for (p = st, printf("以学号进行升序排列:\n"); p < st + n; printf("%d %-7s %.2f\n", p->num, p->name, p->score), p++);
}
//升序排序函数
void sort(Student* st, int n)
{
    int i, j;
    Student temp;
    for (i = 0; i < n; i++)
        for (j = i + 1; j < n; j++)
            if (st[i].num > st[j].num) {
                temp = st[i], st[i] = st[j], st[j] = temp;
            }
}
//二分法查找学号
void find_EFF(Student* st, int n)
{
        int i=0;
        int ans = -1;                            //目标元素下标,初始化为-1
        int x=0;
        scanf("%d",&x);                            //待查找的学号
        int top = st[i].num;
        int base = 0;
        while (top >= base) {                    //查找自己不为空集时重复二分查找
            int mid = (top + base) / 2;            //中间点学号
            int tmp;                            //比较中间点学号与目标学号
            if (st[mid].num > x)
            {
                tmp = 1;
            }
            else if (st[mid].num == x) {
                tmp = 0;
            }
            else {
                tmp = -1;
            }
            if (tmp == 0) {
                ans = mid;
                break;                            //若相等,查找成功跳出
            }
            else if (tmp > 0) top = mid - 1;
            else base = mid + 1;
        }
        if (ans == -1) {
            printf("查无此人!\n");                //查找失败
        }
        else 
            printf("ans");                      //查找成功
    
}
//顺序查找姓名
void find_SX(Student* st, int n)
{
    char key_name[20] = {};
    int i=0;
    int value;
    printf("请输入要查找的学生姓名: ");
    scanf("%s", &key_name);
    value = strcmp(st[i].name, key_name);
    for(i=0;i<n;i++)
        if (value == 0) {                       //查找成功 
            printf("i");
        }
        else 
            printf("查无此人!\n");             //查找失败 
}

运行结果及报错内容

img

我想要达到的结果
有n个学生信息(包括学号,姓名,成绩),按“学号升序”存储在一个结构体数组中,分别用两个函数完成完成按“学号”、“姓名”两个属性进行查找,找出其在数组中是第几个元素。如果不在数组中,则输出“查无此人”。其中学号的查找采用二分法查找,姓名的查找用顺序查找

等待你输入学生编号

img

检查一下是不是死循环了