【问题标题】:scanf and newlines in c [duplicate]c中的scanf和换行符[重复]
【发布时间】:2017-06-05 15:53:20
【问题描述】:

我今天刚刚在 C 课上进行了一次测试,我有理由相信答案可能不正确。

scanf("%d\n", &x); // Evaluate the expression for the string "54321\n"

这个想法非常简单。找到一个整数并将扫描到的数字放在与整数变量x 对应的内存位置。但是,我不相信对scanf 的调用会终止。

就我而言,对标准 I/O 的所有调用 scanf 都会在按下回车键时终止,因此无需在说明符字符串中包含换行符。事实上,这种冗余只会导致程序在搜索永远不会匹配字符串的内容时停止。

有没有人可以澄清scanf 函数的技术细节来解决这个问题?

【问题讨论】:

  • 格式字符串中的尾随空格(无论是空格、制表符还是换行符)是一种交互灾难。

标签: c scanf stdio


【解决方案1】:

我不相信这个对 scanf 的调用会终止。

像"54321\n" 这样的6 个字符输入不足以导致此scanf("%d\n", &x); 返回。程序停顿。还必须发生其他事情。


'\n' 指示 scanf() 使用空格并这样做直到

  1. 检测到非空白。

  2. stdin 已关闭

  3. stdin 出现输入错误(罕见)。

由于stdin 通常是行 缓冲的,scanf() 以块的形式接收数据。

第一个块 123Enter 不足以导致scanf("%d\n", &x); 返回。以上 3 项中的一项需要发生。

任何以下带有一些非空白的输入都满足#1,无论是:
456 Enter 或
xyzEnter 或EnterEnter$Enter 或 ...

然后scanf() 将返回一个 1,表示一个值 123,存储在 x 中。上面的 4、x 或 $ 是检测到的导致完成的非空白。该字符将是stdin 上后续输入读取的下一个字符。


scanf("%d\n", &x); 几乎可以肯定是错误的代码,因为它强制另一行用户输入并且不检查其返回值。

【讨论】:

    【解决方案2】:

    所有对标准 I/O 的 scanf 调用都会在按下回车键时终止,因此不需要在说明符字符串中包含换行符。

    没错。格式字符串中的\n 将忽略任意数量的空格,包括“ENTER”键;因此,您必须输入一个非空白字符来终止 scanf() 调用。所以,是的,\n 是有问题的。

    scanf() 的手册页说:

    · 一系列空白字符(空格、制表符、换行符、 等等。;参见 isspace(3))。该指令匹配任何数量的 输入中的空格,包括无空格。

    顺便说一句,scanf() 本身被认为是有问题的:Why does everyone say not to use scanf? What should I use instead?

    【讨论】:

    • 我认为提问者可能会逃避这样一个事实,即终端缓冲输入并在输入输入时将其发送到进程
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2013-02-18
    • 1970-01-01
    • 2016-11-11
    • 1970-01-01
    • 2018-08-15
    • 1970-01-01
    相关资源
    最近更新 更多