我遇到麻烦的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
,但它仍无效。
答案 0 :(得分:3)
除非您的变量double1
和double2
是指针,否则您将获得未定义的行为。
您需要使用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,显示问题出在扫描double1
和double2
之间。但是在较大的场景中,最好在继续之前验证所有扫描的预期值。
答案 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);