【问题标题】:Need help understanding ungetc behavior used in conjuction with scanf需要帮助了解与 scanf 结合使用的 ungetc 行为
【发布时间】:2012-07-07 13:59:37
【问题描述】:

我无法理解我的程序的行为。它调用scanf,然后是ungetc,然后是printf。

我无法理解输出行为背后的原因。 这是代码。如果有人澄清了这种行为,将会很有帮助。

int main()
{
  int n=0;
  scanf("%d",&n);
  ungetc(n,stdin);
  printf("%d\n",n);
  return 0;
}

在 gcc 编译器和 linux 平台中的输出: 首先,如果我给 90,那么它会等待另一个数字,在我给另一个数字之后,它会打印 90。

【问题讨论】:

  • 在什么时候等待另一个数字?你为什么使用ungetc?
  • ungetc无关,是扫描格式。删除\n 并立即打印。
  • 在我输入第一个说 90 之后,它会等待另一个输入。当我输入另一个数字时,它会打印 90。我只是在尝试使用 ungetc..只是为了学习目的
  • 哦..是的..当我删除 \n 它工作正常。但是在 ungetc 合法之后使用 n 吗?不是 n 值发送回缓冲区吗?
  • @vindhya 不,变量保持不变。 ungetc 接收变量的值,而不是地址,因此无法更改值。

标签: c


【解决方案1】:

\n 结束您的scanf() 格式会指示scanf() 期待并吃掉它在您的号码后面看到的所有空格。它看起来正在等待另一个输入的原因是因为它会读取直到它得到一些 non-whitespace 字符。您输入的任何内容都不会被实际读取,而是留在stdin 以供后续读取。

【讨论】:

    【解决方案2】:

    扫描格式

    scanf("%d\n",&n);
    

    使用您输入的数字之后的所有空格。因此,只有在您输入非空白字符(以及将输入发送到程序的换行符)后,扫描才会完成。 \n 不需要特别指定换行符,它告诉scanf 使用所有后面的空格并忽略它。

    【讨论】:

      猜你喜欢
      • 2011-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-01
      • 2015-11-02
      • 1970-01-01
      • 2017-06-19
      • 2016-05-03
      相关资源
      最近更新 更多