【问题标题】:How can I make scanf() with multiple inputs ignore the others?如何使具有多个输入的 scanf() 忽略其他输入?
【发布时间】:2013-02-27 19:20:18
【问题描述】:
scanf("%s %d %s %d",word1,&num1,word2,&num2);

所以当用户输入“退出”时,它应该停止询问其他 3 个输入。但是它要求我输入另一个“退出”,可能是因为格式中有 2 %s

这方面还有吗? 编辑:因为它必须在一个循环中获得 4 个输入,除非输入了退出。

【问题讨论】:

  • 你可以有一个更花哨的输入解析。也许你可以使用flex + bison,或者antlr
  • @BasileStarynkevitch 只有在看到您的个人资料并发现您是核心 GCC 黑客时,您才建议为 4 字用户输入编写完整的 LALR 解析器:P
  • 不是说只有4个不同的词....

标签: c input formatting stdin scanf


【解决方案1】:

scanf 是一个非常生硬的工具,不擅长与非结构化输入(包括人类:-) 对话。一般来说,如果你和一个人互动,你应该从fgets开始阅读一行,然后将结果行分开,但最方便的是,可能包括sscanf

这比你想象的更糟糕,因为如果你给它提供一些不能作为整数扫描的东西,%d 指令就会卡住。例如,如果您输入quit now,第一个%s 指令将读取单词quit,但%d 将在输入流中留下now,导致scanf 返回1(一个成功的转换-和分配)。下一次读取字符串的尝试将获取并使用now;对于幼稚的代码,这看起来像是后面的第二行输入,而不是第一行的延续。

【讨论】:

  • +1 提到 scanf() 不像我们认为的那样工作。或许您可以提出一个替代方案,例如fgets()
  • @H2CO3:第二行建议以fgets 开头。 :-)
【解决方案2】:
#include <stdio.h>
#include <string.h>

scanf("%s ", word1);
if (strcmp(word1, "quit") != 0)
    scanf("%d %s %d", &num1, word2, &num2);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    • 2017-07-16
    相关资源
    最近更新 更多