sscanf()双精度显示零

sscanf()双精度显示零,c,scanf,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,

我在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
,但仍然不起作用

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

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

注意:除非变量
double1
double2
是指针,否则将获得未定义的行为

您需要使用运算符
的地址来获取指向这些变量的指针:

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

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

请注意
double1
double2
上的
&
——就像打字错误一样


另外,强烈建议检查结果是否为4。不检查
sscanf()
结果确实是这个问题的核心。打印出的“零”是由于未扫描并保留其以前的值(可能是任何值)而导致的
double2
。如果检查了
sscanf()
结果,它会报告3,表明问题在扫描
double1
double2
之间。但在更大的场景中,最好在继续之前验证所有预期值是否已扫描。

代码不起作用的原因是:

sscanf(buffer, "%4[^,],%4[^,],%lf[^,],%lf[^\n]", string1, string2, &double1, &double2);
%[…]
%[^…]
实际上是转换类型,如
%d
%x
,它们匹配/不匹配列出的字符序列,以
]
结尾。请注意,即使您正在解析字符串,也不必提供
%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的解决方案):


为什么不使用非常简单的格式字符串
%3s、%3s、%lf、%lf“
?将
%4[^、]、%4[^、]、%4[^、]、%lf[^、]、%lf[^、]、%lf[^\n]“
更改为
%4[^、]、%lf、%lf”
您没有显示真正的代码(您需要将&double1和&double2传递到ANFSCC中)。剪切并粘贴您的实际代码,然后我们可能会提供帮助。谢谢chux,它成功了,我认为我应该将[^,]也与double一起使用,因为我没有空格。当我问这个问题时,我有“&”符号(现在编辑代码),这是一个打字错误,对此表示抱歉。由于
[^,]
不是以
%
开头,sscanf()正在查找输入字符串中的4个字母。未能找到这些值,扫描停止,将
double2
保留为以前的值。因此,检查sscanf()结果非常重要。谁知道文件和stdin中有什么邪恶的数据?
char *b = "ABC,DEF,0.465798[^,],0.754314[^\n]\n";
sscanf(b, "%4[^,],%4[^,],%lf[^,],%lf[^\n]", string1, string2, &double1, &double2);
sscanf(b, "%4[^,],%4[^,],%lf,%lf", string1, string2, &double1, &double2);
sscanf(buffer, "%3s,%3s,%lf,%lf", string1, string2, &double1, &double2);