题目分析:巨坑!!!
- 有多组类似题目给的样例的输入
- 存储名字的字符数组要够大
解答:
#include <cstdio>
#include <cstring>
using namespace std;
struct student {
char id[10];
char name[100];
char gender[10];
int age;
};
int main() {
int student_num;
int search_times;
while(scanf("%d", &student_num) != EOF) {
student stu[1000];
for(int i=0; i<=student_num-1; i++) {
scanf("%s", stu[i].id);
scanf("%s", stu[i].name);
scanf("%s", stu[i].gender); //dev-c++使用的应该是GBK编码,中文占两个字节,要使用%s输入输出
scanf("%d", &stu[i].age);
}
scanf("%d", &search_times);
char target_id[10]; //声明查询的对象的学号
for(int i=0; i<=search_times-1; i++) {
scanf("%s", target_id);
for(int i=0; i<=student_num-1; i++) {
if(!strcmp(target_id, stu[i].id)) {
printf("%s %s %s %d\n", stu[i].id, stu[i].name, stu[i].gender, stu[i].age);
break; //如果匹配到了,跳出循环进行匹配下一组输入
}//如果没有匹配到且这是最后一次匹配,则打印"No Answer!\n"
if(i==student_num-1) {
printf("No Answer!\n");
}
}
}
}
return 0;
}
笔记:
- 吸收输入字符前的空格有两种方式:getchar()或" %s"
- dev-c++使用的应该是GBK编码,中文占两个字节,要使用%s输入输出
- scanf会自动在输入的字符串结尾补上'\0'
- sizeof()返回的是编译器分配给输入的参数的空间,而不是它实际所占的空间
- scanf可以给字符数组赋超过其容量的值,但这是非法操作,结果有可能正常,也有可能出错。这或许能解释为什么单独测试越界赋值的时候能正常输出输入的字符串,但在本题的代码中则会出错。