Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用scanf的多种输入格式_C_String_Parsing_Scanf - Fatal编程技术网

使用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的回应是最好的方式