问问这个为什么编译后最后查找的步骤没了,代码怎么改?

#include<stdio.h>
#include<string.h>
#include<malloc.h>
struct student
{
char name [10];
char number[10];
int store;
char age[20];
char gender[8];

};
void input(struct student * p)
{
int i;
for(i=0;i<4;i++)
{
printf("请输入姓名(退出输入quit):");
gets((*(p+i)).name);fflush(stdin);
if(!strcmp((*(p+i)).name,"quit"))break;
printf("请输入学号:");
gets((*(p+i)).number);fflush(stdin);
printf("请输入成绩:");
scanf("%d",&((*(p+i)).store));fflush(stdin); 
printf("请输入年龄:");
gets((*(p+i)).age);fflush(stdin);
printf("请输入性别:");
gets((*(p+i)).gender);fflush(stdin);

}
}
void print(struct student * p)
{
int i=0;
for(;(i<4)&&(strcmp((*(p+i)).name,"quit"));i++)
printf
("\name:%-10s nnumber:%-10s\nstore:%-10s age:%-20s\ngender:%-10s\n",(*(p+i)).name,
(*(p+i)).number,(*(p+i)).store,(*(p+i)).age,(*(p+i)).gender);
}
int search(struct student * p,char * num)
{
int i;
for(i=0;i<=4;i++)
if(strcmp(num,(p+i)->name)==0)break;
return (i);
}
int main()
{
int i;
struct student group[5];
char num[10];
input(group);
printf("\n");
print(group);
printf("\n\n请输入要查找的姓名:");
gets(num);
i=search(group,num);
if(i==4)
printf("查无此人");
else
printf("\name:%-10s nnumber:%-10s\nstore:%-10s age:%-20s \ngender:%-10s \n\n\n",(*(group+i)).name,
(*(group+i)).number,(*(group+i)).store,(*(group+i)).age,(*(group+i)).gender);
return 0;
}
阅读 1.4k
1 个回答

你这段代码中的问题可能是因为在输入学生信息时使用了gets函数,而这个函数存在安全隐患。在一些编译器中,会提示警告信息,建议你使用更加安全的函数替代。

另外,在search函数中,参数num应该是一个字符串类型,但是在函数体内却被当做字符类型来比较。这样会导致无法正确查找到学生信息。应该将其改为字符串类型,并使用strcmp函数进行比较。

下面是我修改后的代码:


#include<stdio.h>
#include<string.h>
#include<stdlib.h>

struct student {
    char name[10];
    char number[10];
    int store;
    char age[20];
    char gender[8];
};

void input(struct student* p) {
    int i;
    for (i = 0; i < 5; i++) {
        printf("请输入姓名(退出输入quit):");
        fgets((*(p + i)).name, 10, stdin);
        if (!strcmp((*(p + i)).name, "quit\n")) break;
        printf("请输入学号:");
        fgets((*(p + i)).number, 10, stdin);
        printf("请输入成绩:");
        scanf("%d", &((*(p + i)).store));
        getchar(); // 读取多余的回车符
        printf("请输入年龄:");
        fgets((*(p + i)).age, 20, stdin);
        printf("请输入性别:");
        fgets((*(p + i)).gender, 8, stdin);
    }
}

void print(struct student* p) {
    int i = 0;
    for (; i < 5 && strcmp((*(p + i)).name, "quit\n"); i++)
        printf("\nname:%-10s number:%-10s\nstore:%-10d age:%-20s\ngender:%-10s\n",
            (*(p + i)).name, (*(p + i)).number, (*(p + i)).store, (*(p + i)).age, (*(p + i)).gender);
}

int search(struct student* p, char* name) {
    int i;
    for (i = 0; i < 5; i++) {
        if (!strcmp(name, (*(p + i)).name))
            return i;
    }
    return -1;
}

int main() {
    int i;
    struct student group[5];
    char name[10];

    input(group);
    printf("\n");
    print(group);

    printf("\n\n请输入要查找的姓名:");
    fgets(name, 10, stdin);
    i = search(group, name);
    if (i == -1)
        printf("查无此人");
    else
        printf("\nname:%-10s number:%-10s\nstore:%-10d age:%-20s\ngender:%-10s\n",
            (*(group + i)).name, (*(group + i)).number, (*(group + i)).store, (*(group + i)).age, (*(group + i)).gender));

    return 0;
}

你可以参考一下

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题