4

任何人都可以建议将 csv 字符串转换为 C 中的浮点数组的简单方法吗?

例如

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

到:

my_array = [1.0, 2.0, 3.0]

my_array 的类型在哪里float[]

我将sscanf用作快速简便的解决方案,但我不知道字符串中预先包含多少个值

是否有一些现有的库函数可以做到这一点,而我不必求助于每次char寻找“,”的循环?

4

6 回答 6

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, ",");
}   
于 2012-06-29T22:44:36.483 回答
3

您可以使用一个库 - LibCSV

根据他们的描述:

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

于 2012-06-29T22:43:41.177 回答
2

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

于 2012-06-29T22:40:06.897 回答
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;
}
于 2012-06-30T02:57:43.987 回答
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;
}
于 2012-06-30T03:45:31.280 回答
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)
于 2012-06-29T22:48:58.767 回答