2013-02-18 74 views
1

我正在寻找通过stdinscanf()从用户的几个数据点中读取。多个输入格式与scanf

然而,如果用户希望指示无效数据,由*表示,这将违反预期的格式(%f%d等),并按照我的理解,导致scanf()返回一个错误。

我设想处理这个问题的方法是从stdin读取输入作为一系列字符串,检查它们是否为*,然后处理这个问题。这看起来很幼稚和混乱,我想知道是否有一个更清晰的方法来实现这一点。

请注意,我的工作环境非常有限,因此POSIX /第三方解决方案不适用。 ANSI C只:(

+3

您需要将输入读入缓冲区并尝试解析它一再重复,直到你成功。有很多关于这样做的理论,通常在“编译器”课程中介绍。如果你不想走这条路线,你可以使用'fgets'或'getline'将输入读入缓冲区,然后处理几次,看看它是如何工作的,但它会变得复杂和缓慢除非只有有限数量的可能的正确解析,否则匆忙。 – dmckee 2013-02-18 20:46:51

+0

一个字:'fgets()'。 (好吧,也许两个'strchr()'也适用。) – 2013-02-18 21:46:10

+1

不要使用'scanf'。 http://www.c-faq.com/stdio/scanfprobs.html – jamesdlin 2013-02-18 22:50:50

回答

1

总的来说,我建议fgets()输入,但是......

有,如果你迫使使用“南”为无效数据的用户一个简单的scanf()的解决方案。通过输入“男” (不是非数字),你解决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 
} 
...