使用scanf的多种输入格式
我希望通过使用scanf的多种输入格式,c,string,parsing,scanf,C,String,Parsing,Scanf,我希望通过stdin和scanf()从用户那里读取多个数据点 但是,如果用户希望指示由*表示的无效数据,这将违反预期格式(%f,%d,等等),并且据我所知,会导致scanf()返回错误 我设想的处理方法是将stdin中的输入读取为一系列字符串,检查这些字符串是否为*,然后相应地进行处理。这看起来非常幼稚和混乱,我想知道是否有更干净的方法来实现这一点 请注意,我的工作环境非常有限,因此POSIX/第三方解决方案将不适用。仅ANSI C:(一般来说,我建议输入fgets(),但是 如果您强制用户使用
stdin
和scanf()
从用户那里读取多个数据点
但是,如果用户希望指示由*
表示的无效数据,这将违反预期格式(%f
,%d
,等等),并且据我所知,会导致scanf()
返回错误
我设想的处理方法是将stdin
中的输入读取为一系列字符串,检查这些字符串是否为*
,然后相应地进行处理。这看起来非常幼稚和混乱,我想知道是否有更干净的方法来实现这一点
请注意,我的工作环境非常有限,因此POSIX/第三方解决方案将不适用。仅ANSI C:(一般来说,我建议输入
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
}
...
#包括
#包括
#包括
...
双f1,f2;
int i;
f1=f2=atof(“NaN”);
i=scanf(“%lf%lf\n”、&f1和&f2);
如果(i!=2){
//处理输入错误
}
if(isnan(f1)){
//处理无效的f1
}
...
一般来说,我建议输入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
}
...
#包括
#包括
#包括
...
双f1,f2;
int i;
f1=f2=atof(“NaN”);
i=scanf(“%lf%lf\n”、&f1和&f2);
如果(i!=2){
//处理输入错误
}
if(isnan(f1)){
//处理无效的f1
}
...
您需要将输入读入缓冲区,并尝试反复解析它,直到成功为止。在“编译器”中通常会介绍很多这样做的理论当然。如果你不想走这条路,你可以使用fgets
或getline
将输入读入缓冲区,然后再处理几次,看看它是如何工作的,但除非可能的正确部分数量有限,否则它会变得复杂而缓慢。一个词:fgets()
。(好的,也许两个,strchr()
也适用。)不要使用scanf
。我们希望得到一些优雅而简单的东西,但看起来@dmckee的响应是解决问题的最佳方式。您需要将输入读入缓冲区,并尝试反复解析,直到成功。在“编译器”中通常会介绍很多这样做的理论当然。如果你不想走这条路,你可以使用fgets
或getline
将输入读入缓冲区,然后再处理几次,看看它是如何工作的,但除非可能的正确部分数量有限,否则它会变得复杂而缓慢。一个词:fgets()
。(好的,也许两个,strchr()
也适用。)不要使用scanf
。我们希望得到一些优雅而简单的东西,但看起来@dmckee的回应是最好的方式