将csv字符串转换为浮点数组

时间:2012-06-29 22:35:42

标签: c

有人可以建议一种简单的方法将csv字符串转换为C中的浮点数吗?

e.g。

char my_string[] = "1.0,2.0,3.0";

到:

my_array = [1.0, 2.0, 3.0]

其中my_array的类型为float[]

我会使用sscanf作为快速简便的解决方案,但我不知道字符串中包含多少值

是否有一些现有的库函数可以做到这一点,而我不得不求助于遍历每个char寻找“,”?

6 个答案:

答案 0 :(得分:6)

您可以使用strtok()

float my_array[N]; // if you don't know how many there are, use the heap
int i = 0;

char *tok = strtok(my_string, ",");
while (tok != NULL) {
    my_array[i++] = atof(tok);
    tok = strtok(NULL, ",");
}   

答案 1 :(得分:3)

你可以使用一个库 - LibCSV

根据他们的描述:

  

libcs​​v是一个用纯ANSI编写的小巧,简单,快速的CSV库   可以读写CSV数据的C89。它提供了一个直截了当的   接口使用回调函数来处理解析的字段和行   并且可以解析格式不正确的CSV文件

答案 2 :(得分:2)

使用while()循环,一次仅使用sscanf()读取一个浮点数。只要sscanf()返回0,您就知道自己就在列表的末尾。

答案 3 :(得分:1)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char** split(const char *str, const char *delimiter, size_t *len){
    char *text, *p, *first, **array;
    int c;
    char** ret;

    *len = 0;
    text=strdup(str);
    if(text==NULL) return NULL;
    for(c=0,p=text;NULL!=(p=strtok(p, delimiter));p=NULL, c++)//count item
        if(c==0) first=p; //first token top

    ret=(char**)malloc(sizeof(char*)*c+1);//+1 for NULL
    if(ret==NULL){
        free(text);
        return NULL;
    }
    strcpy(text, str+(first-text));//skip until top token
    array=ret;

    for(p=text;NULL!=(p=strtok(p, delimiter));p=NULL){
        *array++=strdup(p);
    }
    *array=NULL;
    *len=c;
    free(text);
    return ret;
}

void free4split(char** sa){
    char **array=sa;

    if(sa!=NULL){
        while(*sa)
            free(*sa++);//for string
        free(array);    //for array
    }
}

int main(){
    char my_string[] = "1.0,2.0,3.0";
    float *my_array;
    char **strs;
    size_t count;

    strs=split(my_string, ", \t", &count);
    my_array=(float*)malloc(sizeof(float)*count);
    {   //convert
        int i;
        for(i=0;i<count;++i)
            my_array[i]=(float)atof(strs[i]);
        free4split(strs);

    }
    {   //test print
        int i;
        for(i=0;i<count;++i)
            printf("%f\n", my_array[i]);
    }
    return 0;
}

答案 4 :(得分:1)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* getToken(char **p, const char delimiter){
    char *word, *top=*p;
    int len;

    if(*p == NULL || **p == '\0') return NULL;
    while(**p && **p != delimiter)
        ++(*p);
    if(**p != delimiter) return strdup(top);
    len = *p - top;
    ++(*p);
    word=(char*)malloc(sizeof(char)*(len+1));
    strncpy(word, top, len);
    word[len]='\0';
    return word;
}

int main(){
    char my_string[] = "1.0,2.0,3.0";
    float *my_array=NULL;
    char *word, *p=my_string;
    int count=0;

    while(NULL!=(word=getToken(&p, ','))){
        my_array=(float*)realloc(my_array, sizeof(float)*(++count));
        my_array[count-1]=(float)atof(word);
        free(word);
    }
    {   //test print
        int i;
        for(i=0;i<count;++i)
            printf("%f\n", my_array[i]);
    }
    return 0;
}

答案 5 :(得分:0)

您可能希望了解如何使用strchr系列函数。

STRCHR(3)           Linux Programmer's Manual           STRCHR(3)

NAME
       strchr, strrchr - locate character in string

SYNOPSIS
       #include <string.h>

       char *strchr(const char *s, int c);

       char *strrchr(const char *s, int c);

DESCRIPTION
       The  strchr()  function  returns  a  pointer  to the first
       occurrence of the character c in the string s.

       The strrchr() function  returns  a  pointer  to  the  last
       occurrence of the character c in the string s.

RETURN VALUE
       The  strchr()  and strrchr() functions return a pointer to
       the matched character or NULL  if  the  character  is  not
       found.

CONFORMING TO
       SVID 3, POSIX, BSD 4.3, ISO 9899

SEE ALSO
       index(3),  memchr(3),  rindex(3),  strpbrk(3),  strsep(3),
       strspn(3), strstr(3), strtok(3)