【问题标题】:Non-whitespace characters in scanf format stringscanf 格式字符串中的非空白字符
【发布时间】:2021-03-07 08:13:29
【问题描述】:

我有一个关于 scanf 函数在格式字符串中遇到非空白字符时所执行的过程的问题。根据我正在阅读的书:

scanf 函数在格式字符串中遇到非空白字符时,scanf 会将其与下一个输入字符进行比较。如果两个字符匹配,scanf 丢弃输入字符并继续处理格式字符串。如果字符不匹配,scanf 会将有问题的字符放回输入中,然后中止而不进一步处理格式字符串或从输入中读取字符。

我有点困惑。它表示scanf 将其与下一个输入字符进行比较,如果两个字符匹配,scanf 将丢弃输入字符。为什么我们说它与“下一个”输入字符比较?

这是否意味着如果我们有一个格式字符串 scanf("%d/%d", &x, &y) 和输入 2/4scanf 与四个比较,因为它是来自 / 的下一个输入字符?

【问题讨论】:

  • 不,%d 读取 2,下一个输入字符是 /,并与格式字符串中的 / 进行比较。然后%d 变为4

标签: c scanf


【解决方案1】:

描述scanf 的另一种方式是,对于非空白字符,它跟随输入以及它期望在格式字符串中看到的内容。但是,如果它找到不同的阅读器,它会“取消阅读”该字符,然后完全停止扫描。

例如,我们看一下:

int x, y;
int scanned = scanf("%dabc%d", &x, &y);

如果我们给它输入10abc20,那么它会按照这个顺序运行:

  • 它到达%d,读取10,并将其存储在x中。
  • 一个接一个地读取abc,并跟随格式字符串中给出的abc
  • 它到达%d,读取20,并将其存储在y中。
  • 到达格式字符串的末尾,返回值2,用于扫描两个值。
  • 离开代码,输入的所有字符都被消耗掉。

改为使用相同的程序10abz20

  • 它到达%d,读取10,并将其存储在x中。
  • 它正确读取ab,但是当它到达z时,会取消读取该字符,并提前返回值1,因为它只扫描了第一个数字。
  • 留下代码,z20 未读,可以稍后在程序中读取。

因此,在您的示例 scanf("%d/%d", &x, &y) 中,输入 10/20 将完全扫描,但 10d20 只会将 10 扫描到 x 中,而 d20 未读。顺便说一句,10/ 20 10/20 会完全扫描,但 10 /20 不会。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-29
    • 2018-06-02
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 2018-08-15
    • 1970-01-01
    • 2010-11-10
    相关资源
    最近更新 更多