【问题标题】:Multiple input formats with scanf使用 scanf 的多种输入格式
【发布时间】:2013-02-18 20:41:56
【问题描述】:

我希望通过stdinscanf() 从用户那里读取几个数据点。

但是,如果用户希望指示无效数据,用 * 表示,这将违反预期的格式(%f%d 等),据我了解,导致 scanf()返回错误。

我设想处理这个问题的方法是将来自stdin 的输入作为一系列字符串读取,检查这些是否有*,然后相应地处理它。这似乎非常幼稚和混乱,我想知道是否有更清洁的方法来完成此操作。

请注意,我在非常有限的环境中工作,因此 POSIX/3rd 方解决方案将不适用。仅限 ANSI C :(

【问题讨论】:

  • 您需要将输入读入缓冲区并尝试重复解析,直到成功。有很多关于这样做的理论,通常在“编译器”课程中介绍。如果您不想走那条路,您可以使用fgetsgetline 将输入读入缓冲区,然后处理一段时间以查看它是如何工作的,但它会变得复杂且缓慢快点,除非只有有限数量的可能正确解析。
  • 一个字:fgets()。 (好吧,也许两个,strchr() 也适用。)
  • 不要使用scanfc-faq.com/stdio/scanfprobs.html
  • 希望能有一些优雅而简单的东西,但看起来@dmckee 的回应是最好的选择

标签: c string parsing scanf


【解决方案1】:

一般我推荐fgets()作为输入,但是...

如果您强制用户对无效数据使用“nan”,则有一个简单的scanf() 解决方案。通过输入“nan”(非数字),您解决了 3 个问题:发布的问题、如何在代码中表示无效数据以及如何打印出无效数据。

示例:每行读取 2 个数据点

#include<math.h>
#include<stdio.h>
#include<stdlib.h>
...
double f1, f2;
int i;
f1 = f2 = atof("NaN");
i = scanf("%lf %lf\n", &f1, &f2);
if (i != 2) {
  // Handle input error
}
if (isnan(f1)) { 
  // Handle invalid f1
}
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-01
    • 2018-05-11
    相关资源
    最近更新 更多