【问题标题】:C: fscanf erases integer variables values?C: fscanf 擦除整数变量值?
【发布时间】:2010-10-06 04:25:40
【问题描述】:

我有一个 C 程序在我进入 while 循环时遇到错误。

我初始化一个变量(fragmentcount)并使用 fscanf 写入它并为其分配一个值 4(这可行)

int fragmentCount;
if ((fscanf(fp, "%i", &fragmentCount)) == 1) {
   ...
}

但是,当我尝试在下面的 while 循环中访问它时,fragmentCount = 0

while ((fscanf(fp, "%[#]", discards)) != EOF) {
   printf(fragmentCount); // <- pseudocode
}

作为一个简短的实验,我尝试去掉 fscanf 作为 while 循环的条件测试,fragmentCount 是正确的值 (4)。

为什么会这样?我怎样才能避免这种情况?

【问题讨论】:

  • 更多的是把#读入字符串丢弃,而不是避免EOF

标签: c scanf


【解决方案1】:

discards 是如何声明的? fscanf 读取的数据可能超出了discards 的空间,这可能会覆盖其他变量的值。

使用没有字段宽度的 '%[' 格式是个坏主意 - 它是 leaves your program open to buffer overflow errors

【讨论】:

  • @Daniel 如果有多个连续的 '#' 会很麻烦 - 你只有 1 的空间(加上终止的 nul)。
  • 只有一个 #(因此是 2),但是通过 GDB,正是这一行杀死了一切: fscanf(fp, "%[#]", discards);
  • 给你的道具-拯救了我的夜晚:)
  • 就是为什么你永远不会使用无限的 '%[' 格式 - 不能相信那些讨厌的用户不会给你错误的输入 :-)
【解决方案2】:

fscanf 从文件中读取一个值并根据格式字符串对其进行解释。根据http://www.cplusplus.com/reference/clibrary/cstdio/fscanf/,'%i' 格式字符串是未知的(也许您的意思是 '%d'?),因此您不太可能读取您期望的值。

除了文件FILE*和格式字符串,fscanf的所有参数都是out参数,这意味着它们在调用fscanf之前包含的值是无关紧要的,可以被替换。

【讨论】:

猜你喜欢
  • 2020-12-21
  • 1970-01-01
  • 1970-01-01
  • 2018-10-06
  • 2018-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多