【问题标题】:Something is wrong when I try to implement scanf() [closed]当我尝试实现 scanf() 时出现问题 [关闭]
【发布时间】:2016-03-01 21:38:07
【问题描述】:

我想实现一个scanf(),我找到了一个implementation(我将它命名为new_scanf()),它使用fgets()vfscanf()中的特定流中获取输入。

这是我的测试程序,

int main() {
     int a, b;
     new_scanf("%d", &a);
     new_scanf("%d", &b);
     printf("a=%d b=%d", a, b);
}

这个程序在我输入时运行

123 <enter>
456 <enter>
a=123 b=456 ;program shows result correctly

但是我打字的时候出了点问题

123 456 <enter>
;the program is stuck here waiting for another input. scanf() should

不要被困在这里

new_scanf() 的这种行为与 glibc 的scanf() 不同,我不知道如何解决,谁能告诉我如何完美地模拟scanf()

【问题讨论】:

  • 请在问题本身中发布minimal reproducible example
  • 你了解new_scanf 的实现吗?如果没有,具体是什么你不明白?您是否尝试过以任何方式调试问题?
  • @kaylum 如果我理解正确,他写了new_scanf
  • @tobi303 我的理解是 OP 将 new_scanf 从 Internet 上删除。 OP与此有关。所以我在问OP是否真的阅读了代码并试图理解和调试它。
  • C 和 C++ 是不同的语言。这看起来像 C。如果您编译为 C++,请将标记更改为 C++,但不能同时使用两者。

标签: c scanf stdin glibc


【解决方案1】:

当然你不能用fgets()实现scanf来读取输入流,你必须仔细地用getchar()getc(stdin)fgetc(stdin)一次读取一个字节,并放回第一个字节不应与ungetc() 一起使用。正确实施scanf() 是一项艰巨的任务。处理所有选项和格式的完整实现非常困难。

你引用的实现在文件开头有一个警告:

/*
 * ** This not been very well tested.. it probably has bugs
 */

它只处理不合格的整数格式doux 和非标准b,以及字符c 和字符串s 格式。不支持longlong long 或任何其他类型变体,不支持浮点,strncpy 的许多实例,其中大部分不正确...不是您自己实现的良好基础。

【讨论】:

  • 感谢您的回答,但我认为我应该稍后重新发布我的问题。
猜你喜欢
  • 2021-08-26
  • 1970-01-01
  • 2021-08-19
  • 2010-11-05
  • 2022-01-11
  • 1970-01-01
  • 2020-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多