任何人都可以建议将 csv 字符串转换为 C 中的浮点数组的简单方法吗?
例如
char my_string[] = "1.0,2.0,3.0";
到:
my_array = [1.0, 2.0, 3.0]
my_array 的类型在哪里float[]
我将sscanf
用作快速简便的解决方案,但我不知道字符串中预先包含多少个值
是否有一些现有的库函数可以做到这一点,而我不必求助于每次char
寻找“,”的循环?
任何人都可以建议将 csv 字符串转换为 C 中的浮点数组的简单方法吗?
例如
char my_string[] = "1.0,2.0,3.0";
到:
my_array = [1.0, 2.0, 3.0]
my_array 的类型在哪里float[]
我将sscanf
用作快速简便的解决方案,但我不知道字符串中预先包含多少个值
是否有一些现有的库函数可以做到这一点,而我不必求助于每次char
寻找“,”的循环?
你可以使用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, ",");
}
您可以使用一个库 - LibCSV
根据他们的描述:
libcsv 是一个小型、简单、快速的 CSV 库,用纯 ANSI C89 编写,可以读取和写入 CSV 数据。它提供了一个直接的接口,使用回调函数来处理解析的字段和行,并且可以解析格式不正确的 CSV 文件
使用一次while()
只读取一个浮点数的循环sscanf()
。只要sscanf()
返回 0,你就知道你在列表的末尾。
#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;
}
#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;
}
您可能想研究使用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)