随机无法正常工作

时间:2014-04-17 16:50:49

标签: c++ atof g++4.8

我似乎遇到了一些奇怪的问题 atof()函数没有正确转换某些值。对于相同的值, atoi()效果很好 这是我正在做的事情的一小部分:

...
// frequencies is a std::string in format a10d50f20 etc. i.e. letter|frequency in %  
// 6 - 48 characters, always correctly formatted 
for (size_t i = 0; i < frequencies.size(); i+=3)
{
  // #1
  double percentage = atof(frequencies.substr(i+1, i+2).c_str()) / 100;
  // #2
  double percentage = static_cast<double>(atoi(frequencies.substr(i+1, i+2).c_str())) / 100;

  cout << frequencies[i] << " - " << percentage << endl;
}
...

由于一些奇怪的原因,方法#2似乎始终正常工作。

样本输出

FOR:frequency =&#34; a30b30c40&#34;

两种方法都正常工作,给我:
a - 0.30
b - 0.30
c - 0.40

FOR:频率=&#34; a10b10c10d10e10f50&#34;

atof()我得到:
a - 0.10
b - 0.10
c - 1000000000.00 !?
d - 1000000000.00 !?
e - 0.10
f - 0.50
atoi()正确给了我这个:
a - 0.10
b - 0.10
c - 0.10
d - 0.10
e - 0.10
f - 0.50

P.S。我不能使用std :: stod因为mingw ......

2 个答案:

答案 0 :(得分:4)

substr的第二个参数是长度,而不是偏移量。

当您为substr(i+1, i+2)致电d时,您将获得该字符串的整个剩余部分,然后将其解析为指数表示法10e10,即10 * 10 10

答案 1 :(得分:2)

对于datof函数将10e10取为10 x(10 ^ 10)= 1000000000.0(采用工程符号/标准格式)。

你真的为c得到了1000000000.0吗?如果发生同样的事情,我也不知道。