sscanf()双显示零

时间:2013-07-31 12:12:17

标签: c scanf

我遇到麻烦的sscanf()函数来读取双打。我有一个逗号分隔的文本文件,如下所示:

ABC,DEF,0.465798,0.754314
GHI,JKL,0.784613,0.135264
MNO,OPQ,0.489614,0.745812
etc.

首先我用fgets()获取行,然后使用sscanf()获取两个字符串和两个双变量。

fgets(buffer, 28, file);
sscanf(buffer, "%4[^,],%4[^,],%lf[^,],%lf[^\n]", string1, string2, &double1, &double2);

printf("%s %s %f %f\n", string1, string2, double1, double2);

但输出是:

ABC DEF 0.465798 0.000000
GHI JKL 0.784613 0.000000
MNO OPQ 0.489614 0.000000

所以它不会扫描最后一个浮点数。我已经尝试了%lf[^ \t\n\r\v\f,]而只是%lf,但它仍无效。

4 个答案:

答案 0 :(得分:3)

除非您的变量double1double2是指针,否则您将获得未定义的行为。

您需要使用address-of运算符&来获取指向这些变量的指针:

sscanf(buffer, "%3s,%3s,%lf,%lf", string1, string2, &double1, &double2);

答案 1 :(得分:3)

更改

"%4[^,],%4[^,],%lf[^,],%lf[^\n]"

int result;
result = sscanf(buffer, "%4[^,],%4[^,],%lf,%lf", string1, string2, &double1, &double2);
if (result != 4) // handle error

请注意&double1上的double2 - 感冒错误。

同样强烈建议检查结果是4.不检查sscanf()结果是这个问题的核心。打印出的“零”是double2没有被扫描并保留其先前值的结果,这可能是任何东西。如果sscanf()结果已经过检查,则会报告3,显示问题出在扫描double1double2之间。但是在较大的场景中,最好在继续之前验证所有扫描的预期值。

答案 2 :(得分:2)

sscanf(buffer, "%4[^,],%4[^,],%lf[^,],%lf[^\n]", string1, string2, double1, double2);

应该是

sscanf(buffer, "%3s,%3s,%lf,%lf", string1, string2, &double1, &double2);

注意{双人的&(地址)

答案 3 :(得分:1)

您的代码无效的原因是:

sscanf(buffer, "%4[^,],%4[^,],%lf[^,],%lf[^\n]", string1, string2, &double1, &double2);

%[...]%[^...]实际上是转化类型,例如%d%x,它们匹配/不匹配列出的字符序列,以{{1结尾}}。请注意,即使您正在解析字符串,也不必提供]

您的问题是您组合了两种类型的转换类型%s%lf,scanf实际上将后面的部分视为要匹配的字符串,因此例如以下代码将成功解析字符串:

[^...]

最简单的解决方案是离开char *b = "ABC,DEF,0.465798[^,],0.754314[^\n]\n"; sscanf(b, "%4[^,],%4[^,],%lf[^,],%lf[^\n]", string1, string2, &double1, &double2); 部分(chux的解决方案):

[^,]

或使用场宽(Joachim Pileborg和David RF的解决方案):

sscanf(b, "%4[^,],%4[^,],%lf,%lf", string1, string2, &double1, &double2);