很不幸,在我手头的日志中有一些用1.00e4这种表示法的字符串,我知道我可以使用printf和"%e"
说明符来创建该表示法,但我该如何读取它呢?
不幸的是,strtof和scanf似乎在"1e100"上返回0.00000,我需要为此编写自己的解析器吗?
(更新)
我的输入是:
字符串"4.1234567e5"或"4.5e5"
期望输出:
浮点数412345.67或整数"450000"
很不幸,在我手头的日志中有一些用1.00e4这种表示法的字符串,我知道我可以使用printf和"%e"
说明符来创建该表示法,但我该如何读取它呢?
不幸的是,strtof和scanf似乎在"1e100"上返回0.00000,我需要为此编写自己的解析器吗?
(更新)
我的输入是:
字符串"4.1234567e5"或"4.5e5"
期望输出:
浮点数412345.67或整数"450000"
double atof( const char * str );
从这段代码开始:
#include <stdio.h>
int main (void) {
double val;
double val2 = 1e100;
sscanf ("1e100", "%lf", &val); // that's an letter ELL, not a number WUN !
printf ("%lf\n", val); // so is that.
printf ("%lf\n", val2); // and that.
return 0;
}
10000000000000000159028911097599180468360810000000000...
10000000000000000159028911097599180468360810000000000...
它不完全等于1100的原因是因为IEEE754浮点值的性质。将其更改为:
#include <stdio.h>
int main (int argc, char *argv[]) {
double val;
int i;
for (i = 1; i < argc; i++) {
sscanf (argv[i], "%lf", &val);
printf (" '%s' -> %e\n", argv[i], val);
}
return 0;
}
运行它并使用您的示例参数,结果如下:
pax$ ./qq 4.1234567e5 4.5e5 3.47e10 3.47e-10
'4.1234567e5' -> 4.123457e+05
'4.5e5' -> 4.500000e+05
'3.47e10' -> 3.470000e+10
'3.47e-10' -> 3.470000e-10
1e-5
失败了,所以 scanf 中的负数符号不可行? - Tim N.0.000010
。请按照我的第二个代码块完全相同的方式输入。 - paxdiablosscanf ("3.47e-10", "%lf", &val);
这样的情况却不行,在我的 GCC 编译器上返回 0.00000(我不确定是否有问题或者是一个限制)。 - Tim N.34700000000.000000
。你确定你使用的是 double 而不是 float 吗? - paxdiablo如果我使用浮点数据类型,它就无法工作。也许问题就出在那里。