【发布时间】:2021-05-24 05:38:38
【问题描述】:
要求:
编写一个按顺序执行以下任务的 C 程序:
- 在执行窗口中初始显示文件内容
- 向用户询问 ID,在文件中搜索 ID,然后以以下格式显示消息(在执行窗口中):学生 ID:…………对应于………………。谁主修……………… 当您在输出中打印学生姓名时,请勿打印“_”!
问题: 它只输出文件的第一行(也就是第一个学生信息),之后甚至不询问学生 ID。
代码:
#include <stdio.h>
#include <string.h>
typedef struct {
int ID;
char Last_name[30], First_name[30], major[30];
} Class;
int search_for_student(int ID_to_search, Class students[22]) {
int i;
for (i = 0; i < 22; i++) {
if (students[i].ID == ID_to_search)
return i;
}
return -101;
}
void main(void) {
char line[100];
int ID_to_search, i, index, j;
Class students[22];
FILE* infp;
infp = fopen("Section_06.txt", "r");
if (infp == NULL) {
printf("File unexistant!\n");
}
else {
for (i = 0; i < 22; i++) {
fscanf(infp, "%d", students[i].ID);
printf("%d", students[i].ID);
fscanf(infp, "%s", students[i].Last_name);
for (j = 0; j < strlen(students[i].Last_name); j++) {
if (students[i].Last_name[j] == '_')
students[i].Last_name[j] = ' ';
}
printf("%s", students[i].Last_name);
fscanf(infp, "%s", students[i].First_name);
for (j = 0; j < strlen(students[i].First_name); j++) {
if (students[i].First_name[j] == '_')
students[i].First_name[j] = ' ';
}
printf("%s", students[i].First_name);
fgets(students[i].major, 30, infp);
printf("%s", students[i].major);
}
printf("Enter an ID: ");
scanf("%d", &ID_to_search);
index = search_for_student(ID_to_search, students);
if (index == -101)
printf("Student not found!");
else {
printf("Student with ID: %d corresponds to %s %s who is majoring in %s.", students[index].ID, students[index].First_name, students[index].Last_name, students[index].major);
}
}
fclose(infp);
}
【问题讨论】:
-
请编辑您的问题并在此处的单独代码块中发布一些具有代表性的输入数据。
-
我将从学习一种有用的方法来读取文件开始。有代表性的例子见here。
-
关于:
void main(void) {如果你的编译器允许这个语句,那么它就是一个非编译编译器!main()只有两个有效签名,它们是:int main( void )和int main( int argc, char *argv[] ) -
关于如下语句:
for (j = 0; j < strlen(students[i].Last_name); j++) {这是将无符号值与有符号值进行比较。 (j是int和函数:strlen()返回一个无符号的size_t)这仅适用于小的正值 -
OT:发布的代码包含几个“神奇”数字:I.E. 22、30、100。“神奇”数字使代码更难理解、调试等。建议使用
#define语句或enum语句为这些“神奇”数字赋予有意义的名称,然后使用那些有意义的名称贯穿整个代码。