的問題是以下內容:fscanf無法檢測到匹配失敗。 libc錯誤或不?
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
float f = 0.0f;
int n = 0;
n = fscanf(stdin, "%f", &f);
printf("n = %d, f = %f\n", n, f);
return 0;
}
它打印:
n = 1時,F = 100.0000
如果輸入字符串是:
100ergs
已經提供給stdin
。以下行爲在gcc(4.8.1)和VS2010(及更低版本)上發生。這是一個錯誤,還是我錯過了什麼?由於7.19.6.2.19和7.19.6.2.20節中的c標準(c89)明確指出,由於匹配失敗,n應該等於零。
UPD。只是一些額外信息:
http://port70.net/~nsz/c/c99/n1256.html#7.19.6.2p20(Thx至克里斯翹用於鏈路)
2)用於匹配失敗,其如預期運作類似的例子:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int hex = 0x0;
int n = 0;
n = fscanf(stdin, "%x", &hex);
printf("n = %d, hexVal = %x\n", n, hex);
return 0;
}
1)從標準的例子
如果stdin包含0xz輸出爲
n = 0,hexVal = 0
這不是一個匹配失敗。匹配在遇到'e'並且'ergs'未被解析時停止。如果你需要更好的控制,可以考慮使用'strtod',這當然意味着你必須先從'stdin'中讀取一個字符串。 – 2014-10-27 07:26:25
好的,但上面各節中的標準明確指出,在這種情況下(這個例子中輸入相同的例子),它是一個匹配失敗。這就是讓我困惑的原因...... – HighPredator 2014-10-27 07:33:38
@HighPredator,我不想編輯太多的問題,但是您可能想從C99草稿的7.19.6.2.20引用並鏈接到http://port70.net/ 〜nsz/c/c99/n1256.html#7.19.6.2p20作證明。行'count = 0; //「100e」不能匹配「%f」'很重要。 – 2014-10-27 07:38:48