【问题标题】:Values lossing in fscanffscanf 中的值丢失
【发布时间】:2022-11-30 14:44:44
【问题描述】:

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

StudentList.txt

Olivia SWANSON F 29001 20
Emma ONEILL F 7900 19

我尝试使用 来读取数据。

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

令我震惊的是,在 Pelles C 中运行的相同代码会导致正确的结果。

我曾经学习过C++,所以C中可能存在一些重要的规则,但我没有注意到。谁能给我看一下?

谢谢!

【问题讨论】:

  • 顺便说一句,我尝试单独输出'sname'并设置断点。没有值传输到“sname”中。
  • gender 太小,无法容纳一个字符和一个空终止符。 C 字符串是以 null 结尾的字符串,需要一个额外的字符作为终止符。您对 fscanf 的调用写入数组超出其末尾,这会导致未定义的行为,这就是为什么它恰好在一个环境中工作而不在另一个环境中工作的原因。
  • 此外,“我使用的编译器是 Clion”——不,CLion 是一个 IDE,而不是编译器工具链。
  • 如果您在age 之后声明gender,会发生这种情况吗?
  • 就像kotatsuyaki说的那样,性别数组太小,无法容纳值和终止符,当我将性别的大小从1扩展到2时,问题就停止了。真的很有帮助,谢谢!

标签: c string char scanf


【解决方案1】:

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

char gender[1];

char gender[2];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-31
    • 2014-07-19
    • 1970-01-01
    • 2014-11-27
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    相关资源
    最近更新 更多