以下是我想要了解的程序。我唯一困惑的部分是while语句while fscanf(....) == 4
以及if(...) == 0
部分。
有人可以向我解释这一行及其目的吗?
#include <stdio.h>
#include <stdlib.h>
struct str_student {
char UFID[9];
char firstname[20];
char major[10];
int age;
};
int main(int argc, char *argv[]) {
FILE *fStud = fopen("students.dat", "r");
struct str_student S[11];
int i, n = 0;
while( fscanf(fStud, "%s %s %s %i", S[n].UFID, S[n].firstname, S[n].major, &S[n].age) == 4)
{ if(( S[n].age > 40 ) && ( strcmp(S[n].major, "ECE") == 0 ))
n = n + 1;
}
printf("\nStudents of the ECE Department who are 41 or more years old:\n");
for( i=0; i<n; i++ ) {
printf("%s\n", S[i].UFID);
}
return 0;
}
答案 0 :(得分:5)
fscanf
返回已读取的字段数。格式字符串"%s %s %s %i"
有四个字段,因此只要while (fscan(...) == 4)
能够读取所有四个字段,fscanf
就会循环。如果它到达文件结尾(EOF),或者文件包含格式不正确的数据(例如%i
字段不是有效整数),它将退出。
strcmp
返回0。 if (strcmp(a, b) == 0)
是检查C中两个字符串是否相等的最常用方法。
答案 1 :(得分:0)
解释
if(( S[n].age > 40 ) && ( strcmp(S[n].major, "ECE") == 0 ))
n = n + 1;
表达式的两个部分
if (condition1 && condition2)
必须是真的。
如果age > 40
,第一部分显然是正确的。
如果比较的两个字符串相同,则第二部分为真strcmp(...) == 0
。
fscanf()
的结果已存储在数组索引[n]
中,但仅当条件为真时,索引才会递增。否则,结果将被下一条数据线覆盖(如果没有其他数据线,则被丢弃)。