首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >strtod返回0

strtod返回0
EN

Stack Overflow用户
提问于 2014-11-05 19:49:12
回答 3查看 1.3K关注 0票数 2

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

代码语言:javascript
复制
A 0.0345
B 0.3945
...
Z 0.2055

基本上,我正在读取每一行,在读完这行之后,我只想将从字符串中提取出。我正在尝试使用strtod(),每个人的示例似乎都很好地使用它,但在我的示例中,它只返回0。

这是我的代码:

代码语言:javascript
复制
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。任何帮助都将不胜感激!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-11-05 19:53:07

由于第一个字符是非数字字符,所以strtod应该返回等于bufferletters (第一个字符无效),这表明没有读取任何内容。

您应该能够通过传递&buffer[2]来修复这个问题,从该数字开始的位置:

代码语言:javascript
复制
relFreq = strtod(&buffer[2], &letters);

演示。

票数 2
EN

Stack Overflow用户

发布于 2014-11-05 19:52:39

我不知道为什么你认为strtod会忽略你的台词中的主要字母,但它不会。你需要这样做:

代码语言:javascript
复制
relFreq = (double) strtod(&buffer[1], &letters);

既然你不使用letters

代码语言:javascript
复制
relFreq = (double) strtod(&buffer[1], NULL); 
票数 1
EN

Stack Overflow用户

发布于 2014-11-05 20:04:15

你可以用sscanf。例如

代码语言:javascript
复制
#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

代码语言:javascript
复制
0.034500

至于您的代码,那么您首先可以在缓冲区中找到一个数字,并将函数strtod应用于指向已找到的数字的指针,条件是缓冲区中的第一个字段总是非数字的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26765795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档