c - scanf 格式字符串中的非空白字符

标签 c scanf

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

When a scanf function encounters a non-whitespace character in a format string, scanf compares it with the next input character. If the two characters match, scanf discards the input character and continues processing the format string. If the characters don't match, scanf puts the offending character back into the input, then aborts without further processing the format string or reading characters from the input.


我有点困惑。它说 scanf将其与下一个输入字符进行比较,如果两个字符匹配,则 scanf丢弃输入字符。为什么我们说它与“下一个”输入字符进行比较?
这是否意味着如果我们有一个格式字符串scanf("%d/%d", &x, &y)和输入 2/4 , scanf与四个比较,因为它是来自 / 的下一个输入字符?

最佳答案

另一种描述方式 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才不是。

    关于c - scanf 格式字符串中的非空白字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66514456/

    相关文章:

    c - 第一个线程未使用给定参数运行

    c - 直接或通过 C/Clang 转换为 LLVM IR

    c - 仅 C 代码的未定义对 `__aeabi_unwind_cpp_pr1' 的引用

    C 编程 - 将空格分隔的字符串读入 BST

    c - 以特殊格式将空字符串与scanf匹配的问题

    scanf 函数后无法继续

    c - 字符串数组和 char ** 环境变量

    c - 可加载内核模块编程和系统调用拦截

    c - C 中的 Scanf 文本溢出

    c - scanf 一次获取多个值