值在fscanf中丢失

kkih6yb8  于 2022-12-02  发布在  其他
关注(0)|答案(2)|浏览(138)

我使用的IDE是Clion。我想读取存储在.txt文件中的行分隔数据。每行包含名、姓、性别、ID和年龄,即str、str、str、int和int。
StudentList.txt

Olivia SWANSON F 29001 20
Emma ONEILL F 7900 19

我尝试使用fscanf来读取数据。

FILE *fp;
char fname[20];
char sname[20];
char gender[1];
int ID;
int age;
fp = fopen("C:\\Users\\Catlover\\Desktop\\DSA\\Program2\\StudentList.txt", "r");
while(fscanf(fp, "%s %s %s %d %d", fname, sname, gender, &ID, &age)!= EOF)
{
    printf("%s,%s,%s,%d,%d\n", fname, sname, gender, ID, age);
}
fclose(fp);
return 0;

但是它返回的结果看起来有点奇怪,因为它没有输出第二个值。
结果为

Olivia,,F,29001,20
Emma,,F,7900,19

令我震惊的是,在PellesC中运行的相同代码会产生正确的结果。
我曾经学习过C++,所以C中可能存在一些重要的规则,但我没有注意到。谁能给我演示一下吗?

nbysray5

nbysray51#

"%s"不带 * 宽度*

不要在*scanf()中使用"%s",而不使用宽度来指示要读取和保存的非空白字符的最大数量。请记住,阅读后,将追加一个 * 空字符 *。示例:如果缓冲区大小为100,则代码最多只能读取99。
char gender[1];对于"F"来说太小。

错误检查

fscanf(fp, "%s %s %s %d %d", ...)可以传回5EOF以外的其他值。因为只有5是可接受的,所以请针对它进行测试。

测试打开成功

如果fopen()失败,则fscanf()fclose()是坏的

还存在其他问题*

但让我们从修复上面的使用开始。

char fname[20 + 1];
char sname[20 + 1];
char gender[1 + 1];
int ID;
int age;
FILE *fp = fopen("C:\\Users\\Catlover\\Desktop\\DSA\\Program2\\StudentList.txt", "r");
if (fp) {
  while(fscanf(fp, "%20s %20s %1s %d %d", fname, sname, gender, &ID, &age) == 5) {
    printf("%s,%s,%s,%d,%d\n", fname, sname, gender, ID, age);
  }
  fclose(fp);
}
return 0;
f3temu5u

f3temu5u2#

您还需要有空间来容纳null字节。

char gender[1];

char gender[2];

相关问题