从C中的字符串中提取十进制数会导致分段错误

问题描述 投票:1回答:2
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int Extract(char input[], double output[])
{
    int i, j, len;
    i=0;
    j=0;
    len=0;
    char s[50];
    while(i<strlen(input)-1)
    {
        if(input[i]==' ') i++;
        j=0;
        s[0]='\0';
        while(input[i]!=',')
        {
            if(input[i]==' ') i++;
            s[j]=input[i];
            i++;
            j++;
        }
        s[j]='\0';
        i++;
        printf("%s - ", s);
        output[len]=(double)atof(s);            
        printf("Element %d: %lf\n", len, output[len]);
        len++;
    }
    printf("%d", len);
    return len;
}

int main(){
    char s[120]="0.1,0.35,0.05,0.1,0.15,0.05,0.2.";
    double v[1000];
    int len = Extract(s, v);
    int i;
    for(i=0; i<len; i++)
    {
        printf("%d: %lf\n", i, v[i]);
    }
    return 1;
}

我尝试运行此代码,但是即使编译正确,我也会遇到堆栈错误,有人可以帮助我吗?请注意,该字符串由一些用逗号分隔的十进制数字组成,并且该字符串以..>结尾

更新:也许文件夹中有些脏东西,但是现在我有一个输出:长度:320.1-元素0:0.0000000.35-元素1:0.0000000.05-元素2:0.0000000.1-元素3:0.0000000.15-元素4:0.0000000.05-元素5:0.000000分段错误(核心已转储)

由于我已经创建了线程,我仍然可以利用您的帮助将字符串转换为双精度,因为atof转换为浮点型,这可能就是为什么它全部打印0.0000的原因?

#include #include #include int Extract(char input [],double output []){int i,j,len; i = 0; j = 0; len = 0;字符s [50]; while(i&...

c arrays string double
2个回答
0
投票

我认为我发现了问题:

  • 您的循环仅检查字符是否不是','。在输入末尾,您没有','字符,而是具有'.',这将导致循环永远进行下去,从而导致段错误。您可以通过将输入的最后一个字符更改为','来解决此问题。
  • 您的浮点输出格式不正确。如果只需要打印两个有效数字,则将%lf更改为%.2lf

0
投票

这里我展示了3个代码,其中第一个解决了段错误问题;第二个是对提取功能的详细说明(如所展示);第三,以许多可能的一种

改进形式编写的Extract函数示例。
© www.soinside.com 2019 - 2024. All rights reserved.