解释这段程序int searchByName(char name[]) { printf("查找到的同学的信息:\n"); int index; for (int i = 0; i < count; i++) { if (strstr(students[i].name, name) != NULL) { printf("%s\t%s\t%s\t%d\t%d\t%d\n", students[i].id, students[i].name, students[i].gender, students[i].chinese, students[i].math, students[i].english); index=i; break; } } return index; }
时间: 2024-02-26 18:55:50 浏览: 36
这是一个 C 语言的函数,用于在一个学生信息的数组中,按照姓名查找一个学生的信息,函数的输入参数是一个字符数组,代表要查找的学生姓名。函数会遍历学生信息的数组,使用 `strstr` 函数来判断该学生姓名是否包含要查找的字符串,如果包含,则输出该学生的信息,并记录该学生在数组中的下标 index,然后退出循环。如果没有找到匹配的学生,则返回 -1。函数返回值为 index,即找到的学生信息在数组中的下标,或者为 -1,表示未找到匹配的学生信息。
相关问题
scanf("%d",&a); switch(a) { case 1: printf("要查找的姓名\n"); char name[20]; scanf("%s",name); int index; index=SearchByName(stu, n, name); if(index != -1) { printf("查询结果:\n%s %s %d\n", stu[index].name, stu[index].id, stu[index].room); } else { printf("没有找到该学生\n"); }break; case 2: printf("要查找的学号\n"); char id[15]; scanf("%s",id); int indexa; indexa=SearchByNumber(stu, n, id); if(indexa != -1) { printf("查询结果:\n%s %s %d\n", stu[indexa].name, stu[indexa].id, stu[indexa].room); } else { printf("没有找到该学生\n"); }break; case 3: printf("要查找的房间\n"); int room; scanf("%d",&room); int indexb; indexb=SearchByroom(stu, n, room); if(indexb !=-1) { printf("查询结果:\n%s %s %d\n", stu[indexb].name, stu[indexb].id, stu[indexb].room); } else { printf("没有找到该学生\n"); }break; case 0: b=0; printf("已经退出查询\n"); break; default: printf("输入的类型无效,请重新输入。\n"); break; } } return 0; }查询不了第一个
在这段代码中,无法查询到第一个学生的原因可能是因为在输入要查找的姓名时,输入了多余的空格或回车符。这些字符会被当作字符串的一部分,导致和结构体数组中的字符串不匹配,最终导致查找失败。
解决方法是在读取输入字符串之前先清除输入缓冲区中的多余字符,可以使用 `getchar()` 函数清除缓冲区中的字符。例如:
```
printf("要查找的姓名\n");
char name[20];
scanf("%*[^\n]"); // 清除输入缓冲区中的多余字符
scanf("%*c"); // 将换行符从输入缓冲区中取出
scanf("%s", name);
```
这样就可以避免多余字符对字符串匹配造成的影响,确保可以查询到第一个学生。
void SearchByName(struct student stu[], int n, char *name) { int left = 0, right = n - 1; while (left <= right) { int mid = (left + right) / 2; if (strcmp(stu[mid].name, name) == 0) { return mid; } else if (strcmp(stu[mid].name, name) > 0) { right = mid - 1; } else { left = mid + 1; } } return -1; } scanf("%s",name); int index; index=SearchByName(stu, n, name); if(index!=-1) { printf("查询结果:\n%s %s %d\n", stu[index].name, stu[index].id, stu[index].room); } else { printf("没有找到该学生\n");如何修改
这段代码本身有一些问题,因为函数的返回类型是void,但是在函数内部又使用了return语句。应该将函数的返回类型修改为int,以便正确返回查找结果。此外,在找到目标学生时应该直接返回mid,而不是返回函数值为mid。修改后的代码如下:
```
int SearchByName(struct student stu[], int n, char *name) {
int left = 0, right = n - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (strcmp(stu[mid].name, name) == 0) {
return mid;
} else if (strcmp(stu[mid].name, name) > 0) {
right = mid - 1;
} else {
left = mid + 1;
}
}
return -1;
}
// 在主函数中的调用代码
scanf("%s",name);
int index = SearchByName(stu, n, name);
if (index != -1) {
printf("查询结果:\n%s %s %d\n", stu[index].name, stu[index].id, stu[index].room);
} else {
printf("没有找到该学生\n");
}
```
阅读全文