【问题标题】:What exactly happens when I input a string "abcd" to scanf("%d", &var)?当我在 scanf("%d", &var) 中输入字符串 "abcd" 时究竟会发生什么?
【发布时间】:2014-08-20 22:48:54
【问题描述】:

输入字符串到

scanf("%d",&var) returns 0.

有一个类似的问题here,但没有提供对内部发生的情况的解释。提供的是一种处理这种情况的方法。

GCC 究竟如何处理传递给 scanf("%d",&var) 的字符串,为什么在这种情况下返回值是 0?

【问题讨论】:

  • 这实际上是您的标准 C 库,而不是 Gcc,这里在做什么(忽略内置函数)。而且 Gcc 永远不会看到在运行时传入的字符串。
  • 我不完全理解你的问题(或者至少不是,链接的问题中没有回答什么)。是吗,如何从流中读取一个字节,然后在它是无效字节的情况下将其推回?对于实施细节:看看例如glibc 源代码。
  • > “是吗,如何从流中读取一个字节,然后在它是无效字节的情况下将其推回?”这正是我想了解的.
  • Here是前面提到的源代码,他们使用了genops.c中定义的内置函数_IO_sputbackc。您可能还想查看标准 C 函数 ungetcfseek。您的问题的答案将取决于所使用的平台,但至少您现在有几点可以开始……
  • 非常感谢@mafso!

标签: c gcc scanf


【解决方案1】:

成功时,函数返回参数列表中成功填充的项目数。因此,如果您不输入数字,则读取的项目数将为 0。

更多信息请参考http://www.cplusplus.com/reference/cstdio/scanf/

【讨论】:

    【解决方案2】:

    成功完成后,scanf 应返回成功匹配和分配的输入项的数量;如果发生早期匹配失败,此数字可以为零。

    在格式字符串中看到 %d 时,scanf 需要 int 类型的数据。当您输入字符串代替int 时,scanf 开始读取输入,当看到字符时,停止读取并返回0

    【讨论】:

      猜你喜欢
      • 2023-04-01
      • 2023-03-29
      • 2012-01-15
      • 1970-01-01
      • 2013-06-13
      • 1970-01-01
      • 2019-07-29
      • 1970-01-01
      • 2012-06-06
      相关资源
      最近更新 更多