strtod回归0

时间:2014-11-05 19:49:13

标签: c string double

我一直在处理这个项目,该项目处理的输入文件如下所示:

A 0.0345
B 0.3945
...
Z 0.2055

基本上,我在读完每一行后,我想把拉出字符串的双倍。我尝试使用strtod()并且每个人的例子似乎都很好地使用它,但在我的例子中,它只返回0.

这是我的代码:

for (count = 0; count < 26; count++)
{
    char buffer[100]; /* Buffer for the line read by fgets */
    char *letters; /* Stores the string calculated by strtod */
    double relFreq = 0.0;

    if (fgets(buffer, 100, stream) != NULL)
    {
        relFreq = (double)strtod(buffer, &letters); /* Since the format is A 0.0000, we're just grabbing the double */
        *(sampleOne + count) = relFreq; /* Add the relFreq to the array */
    }
}

通过使用调试器,buffer具有正确的数据,例如A 0.0345\n,但当strtod()返回值时,它始终为0.任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:2)

由于第一个字符是非数字字符,strtod应该返回letters等于buffer(第一个字符无效),表示没有读取任何内容。

您应该可以通过传递号码开始的&buffer[2]来解决此问题:

relFreq = strtod(&buffer[2], &letters);

Demo.

答案 1 :(得分:1)

我不确定为什么你认为strtod会忽略你们行上的主要信件,但事实并非如此。你需要做这样的事情:

relFreq = (double) strtod(&buffer[1], &letters);

因为你没有使用letters

relFreq = (double) strtod(&buffer[1], NULL); 

答案 2 :(得分:1)

您可以使用sscanf。例如

#include <stdio.h>

int main(void) 
{
    char *s = "A 0.0345\n";

    char c;
    double d;

    sscanf( s, "%c %lf", &c, &d );

    printf( "%f\n", d );

    return 0;
}

输出os

0.034500

至于你的代码,那么你首先可以在缓冲区中找到一个数字并将函数strtod应用于指向找到的数字的指针,前提是缓冲区中的第一个字段始终是非数字。