fscanf无法检测到匹配失败。libc bug与否?

fscanf无法检测到匹配失败。libc bug与否?,c,scanf,libc,C,Scanf,Libc,问题如下: 如果标准输入包含0xz,则输出为 n=0,hexVal=0 除非他们在最终标准中做了更改,否则您看到的行为就是一个bug。(感谢HighPredator的链接) .您正在从流中读取fscanf获取所有可接受的字符。。。剩下的留给下一次读取操作。在C中,以下两个代码段给出了相同的结果: int i, j; fscanf(stdin, "%d", &i); fscanf(stdin, "%d", &j); 及 如果你输入12,你会得到i=1,j=2 您希望从中得到什么

问题如下:


如果标准输入包含0xz,则输出为

n=0,hexVal=0


除非他们在最终标准中做了更改,否则您看到的行为就是一个bug。(感谢HighPredator的链接)


.

您正在从流中读取
fscanf
获取所有可接受的字符。。。剩下的留给下一次读取操作。在C中,以下两个代码段给出了相同的结果:

int i, j;
fscanf(stdin, "%d", &i);
fscanf(stdin, "%d", &j);

如果你输入
12
,你会得到
i=1
j=2

您希望从中得到什么:

float f = 0.0f;
int n = 0;
char c[16];

n = fscanf(stdin, "%f", &f);
printf("n = %d, f = %f\n", n, f);
n = fscanf(stdin, "%15s", c);
printf("n = %d, string = %s\n", n, c);
使用
100erg
馈送时,您会得到:

n = 1, f = 100.0000
n = 1, string = erg

因此,当前的
fscanf
结果是完全正确的,因为
100
可以接受为输入浮点。

这不是匹配失败。当遇到未解析的“e”和“ergs”时,匹配停止。如果您需要更精细的控件,请考虑使用<代码> Strutod ,这当然意味着您必须先从<代码> STDIN 中读取一个字符串。OK,但是上面章节中的标准确实清楚地说明了,在那个确切的例子中(同一个输入有相同的例子),它是一个匹配的失败。这正是让我困惑的地方…@HighPredator,我不想把你的问题编辑得太远,但你可能想引用C99草案的7.19.6.2.20并链接到以供证明。行
count=0;//“100e”无法匹配“%f”
这一点很重要。@ChrisCulter,链接的thx。没问题,我是从:)这是新的。我从来没有在任何地方见过。你能提供一个链接吗?因为我觉得scanf group和strto。。群体是机械上不同的功能。是的,显然他们确实是机械上不同的@HighPredator我误读了相关的草稿。好像是个虫子。谢谢你指出。这就是我想指出的。“所以目前的fscanf结果是完全正确的。”根据上述标准的例子,情况并非如此。其次,根据6.4.4.2的描述,100erg的第100e部分是一个有效的“前缀”。由于imho标准要求scanf在这种情况下返回零。看起来我的段落的计算与此不同。。。不管怎么说,以下是我用简单的话所说的,我认为:100e是指数形式的浮点值的有效“前缀”(就像0x代表十六进制),然后,在它之后,stdin不包含有效的数字部分。在这种情况下,匹配的失败案例应该发生(就像十六进制一样),并且应该返回零。@HighPredator:我们在黑暗面。我在MSVC2008中试用过它,它将
100e
(给出
100.
)和
rg
,但是clang 3.1和gcc 4.2.1(FreeBSD 9.0)将
100
erg
分开。我没有最近可用的编译器来查看它是否随它们而变化。
int i, j;
fscanf(stdin, "%d%d", &i, &j);
float f = 0.0f;
int n = 0;
char c[16];

n = fscanf(stdin, "%f", &f);
printf("n = %d, f = %f\n", n, f);
n = fscanf(stdin, "%15s", c);
printf("n = %d, string = %s\n", n, c);
n = 1, f = 100.0000
n = 1, string = erg