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; }查询不了第一个
时间: 2024-03-21 15:38:02 浏览: 47
在这段代码中,无法查询到第一个学生的原因可能是因为在输入要查找的姓名时,输入了多余的空格或回车符。这些字符会被当作字符串的一部分,导致和结构体数组中的字符串不匹配,最终导致查找失败。
解决方法是在读取输入字符串之前先清除输入缓冲区中的多余字符,可以使用 `getchar()` 函数清除缓冲区中的字符。例如:
```
printf("要查找的姓名\n");
char name[20];
scanf("%*[^\n]"); // 清除输入缓冲区中的多余字符
scanf("%*c"); // 将换行符从输入缓冲区中取出
scanf("%s", name);
```
这样就可以避免多余字符对字符串匹配造成的影响,确保可以查询到第一个学生。
相关问题
找出错误并改正 #include<stdio.h> void f(int n){ char result; int k=0; k=(n>=93)+(n>=85)+(n>=80)+(n>=75)+(n>=70)+(n>=65)+(n>=60); switch(k){ case 0:printf("F");break; case 1:printf("D");break; case 2:printf("C");break; case 3:printf("C+");break; case 4:printf("B");break; case 5:printf("B+");break; case 6:printf("A");break; case 7:printf("A+");break; } } int main(){ int N; printf("Name_f Name_l stu_id score retake GPA rank\n"); for(N=0; N<100; N++){ char lname,fname; int n,m,f1,f2; scanf("%c %c", &lname, &fname); scanf("%d %d",&n,&m); f1=n/100000000; if(n<202000000000 || n>202300000000) continue; if(f1==2022) f2=0; else f2=1; printf("%c %c %d %d %d",lname,fname,n,m,f2); f(n); } return 0; }
这段代码没有明显的错误,但可以进行一些改进:
1. 在输入字符时,应该在%c前加上一个空格,以避免吸收之前输入的回车符。
2. 在函数f中,变量result并没有被使用,可以删除。
3. 在函数f中,可以将switch语句中的case合并,如将case 3和case 4合并为一个case,避免重复的代码。
改进后的代码如下:
```
#include<stdio.h>
void f(int n) {
int k = 0;
k = (n >= 93) + (n >= 85) + (n >= 80) + (n >= 75) + (n >= 70) + (n >= 65) + (n >= 60);
switch(k) {
case 0: printf("F"); break;
case 1: printf("D"); break;
case 2: printf("C"); break;
case 3:
case 4: printf("B"); break;
case 5:
case 6: printf("A"); break;
case 7: printf("A+"); break;
}
}
int main() {
int N;
printf("Name_f Name_l stu_id score retake GPA rank\n");
for(N = 0; N < 100; N++) {
char lname, fname;
int n, m, f1, f2;
scanf(" %c %c", &lname, &fname);
scanf("%d %d", &n, &m);
f1 = n / 100000000;
if(n < 202000000000 || n > 202300000000) continue;
if(f1 == 2022) f2 = 0;
else f2 = 1;
printf("%c %c %d %d %d", lname, fname, n, m, f2);
f(n);
}
return 0;
}
```
void return_ticket(char name[], int num) { int i; for (i = 0; i < num_sights; i++) { if (strcmp(sights[i].name, name) == 0) { sights[i].rest_tickets += num; printf("退票成功!共返还 %d 元。\n", sights[i].price * num); return; } } printf("未找到名为 %s 的景点!\n", name); } int main() { int choice; char name[20]; int price, tickets, num; while (1) { printf("请输入操作代码:\n"); printf("1. 添加景点\n"); printf("2. 查询景点信息\n"); printf("3. 购买门票\n"); printf("4. 退回门票\n"); printf("5. 退出\n"); scanf("%d", &choice); switch (choice) { case 1: printf("请输入景点名称、门票价格和余票数量:\n"); scanf("%s %d %d", name, &price, &tickets); add_sight(name, price, tickets); break; case 2: printf("请输入景点名称:\n"); scanf("%s", name); query_sight(name); break; case 3: printf("请输入景点名称和购票数量:\n"); scanf("%s %d", name, &num); buy_ticket(name, num); break; case 4: printf("请输入景点名称和退票数量:\n"); scanf("%s %d", name, &num); return_ticket(name, num); break; case 5: return 0; default: printf("无效的操作代码!\n"); } } }
这段代码是一个简单的景点门票管理系统。使用者可以添加景点、查询景点信息、购买门票和退回门票。
在主函数中,使用者可以输入操作代码,选择需要执行的操作。如果选择添加景点,则需要输入景点名称、门票价格和余票数量,程序会将这些信息存储到一个结构体数组中。如果选择查询景点信息,则需要输入景点名称,程序会输出该景点的信息。如果选择购买门票,则需要输入景点名称和购票数量,程序会检查该景点的余票数量是否足够,如果足够则减少余票数量并输出购买成功信息,否则输出购买失败信息。如果选择退回门票,则需要输入景点名称和退票数量,程序会将该景点的余票数量增加并输出退票成功信息。
在这个简单的系统中,使用了结构体和函数等基本的程序设计概念,可以用于入门级别的程序设计学习和练习。
阅读全文