【问题标题】:Wanting scanf to proceed without all parameters filled [duplicate]希望scanf在没有填充所有参数的情况下继续[重复]
【发布时间】:2020-03-26 07:31:51
【问题描述】:

我想要一个 scanf 函数,它允许用户输入最多四个由空格分隔的整数,但如果只输入 2 个整数,它仍然运行。

scanf("%d %d %d %d", &command, &num_one, &num_two, &num_three);

【问题讨论】:

    标签: c


    【解决方案1】:

    scanf 正是这样做的。它返回它执行的成功转换的数量。如果它无法执行转换(或无法匹配文字字符),它将在该点精确停止读取。

    您应该始终检查它的返回值,即使您复制的示例没有这样做。

    scanf 不保证转换后的值用空格分隔。它们可能由换行符分隔。如果你想要一个换行符来停止扫描,你需要使用类似fgets(或者,如果可能的话,最好是Posix getline函数)来读取该行,然后在读取的行上调用sscanf .

    您还可以强制scanf 在行尾停止,方法是使用%*[ \t] 而不是 分隔%ds,这将只匹配空格和制表符。 (* 导致scanf 不尝试保存匹配的字符串,并且也不将转换计入其返回计数中。)但这会让您遇到scanf 的另一个问题:如果有垃圾行,您通常希望从下一行继续阅读。 getline/sscanf 解决方案将为您做到这一点。如果您使用scanf,则需要手动刷新输入行的其余部分,这需要调用fgetsgetline

    当我在这里时,请注意scanf("%d %d %d %d", ...)scanf("%d%d%d%d", ...) 之间没有区别,因为%d 与除%c%[%% 之外的所有scanf 转换一样,会跳过前导空格。

    【讨论】:

    • 问题是,如果我只输入 2 个整数,它不会继续,直到我输入另一个 2。
    • @Isaac:这就是它接受换行符作为空格的问题。
    猜你喜欢
    • 2015-12-02
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    • 2020-09-02
    相关资源
    最近更新 更多