【问题标题】:What's the value stored in the argument variable when scanf(fscanf) encounters EOF?当 scanf(fscanf) 遇到 EOF 时,参数变量中存储的值是多少?
【发布时间】:2017-03-27 06:49:21
【问题描述】:
int *ptr = malloc~
while (fscanf(fp, "%d", ptr++) != EOF)
    ;

假设有足够的内存分配给 ptr, 当函数遇到 EOF 时,存储在 *ptr 中的值表示什么? 我尝试在 Visual Studio 中使用调试工具,发现 *ptr 的值为 -33686019 这是垃圾值吗?还是EOF?

【问题讨论】:

  • 未初始化值,即垃圾值。另外,需要保存第一个地址。
  • 未指定。仅当在分配 第一个输入参数之前发生错误时才返回 EOF。
  • 例如,如果文件中的第一个字符不是数字,那么为什么scanf (or its siblings) 会存储任何东西?如果您得到EOF(或零!),那么您根本无法假设存储了有效值。
  • 顺便说一句,当您使用ptr++ 作为参数时,请记住您丢失了原始指针。在你做ptr++之后你不能再通过ptr调用free,最终数据存储的位置就丢失了。
  • 请注意,如果输入中有非数字、非空白字符(例如字母),那么您的循环将失控崩溃。您应该始终以预期的有效值数量为循环条件:while (fscanf(fp, "%d", ptr++) == 1 && ptr < end) ;(其中end 是最初分配的值ptr 加上分配的int 的数量)。您还需要保留ptr 的值以供以后使用——如果没有别的,则用于free()

标签: c eof scanf


【解决方案1】:

当 scanf 命中 EOF 时,没有值被存储ptr 指向的地址。 同样,如果它返回 0。这就是为什么迭代输入的规范方法必须检查 scanf 返回值,例如与

if (fscanf(fp, "%d", &ptr_to_int) == 1) {
  /* successful conversion */
}
else {
  /* Unsuccesful conversion or EOF; use feof() to test which. */
}

【讨论】:

    猜你喜欢
    • 2016-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    • 1970-01-01
    • 2015-05-25
    • 2019-12-23
    相关资源
    最近更新 更多