2.01; 0.441726296835717; -0.564010125045376; -0.416244141468842; -0.559920773166141; 1; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0;
2.025; 0.441775420652974; -0.563994918440088; -0.416232918868251; -0.55990567681625; 1; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0;
2.04; 0.441888754828675; -0.563983772823187; -0.416224693310709; -0.55983357975964; 1; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0;
2.055; 0.441968179548186; -0.563946209146259; -0.416242015187121; -0.559795843365589; 1; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0;
2.07; 0.442017290067744; -0.563930996016906; -0.416230786556594; -0.55978074219736; 1; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0;
上面的文字是我一直在努力的数据。这些是5个句子(实际上更多),由21个数字组成,并用分号(;)分隔。我只想从第2到第5个数字中提取4个数字,这些数字以长数字显示。
我尝试过解析,但每个分段的数字都必须分配给不同的变量,以便我可以添加一些计算过程。我真的希望我能得到一些提示,即使它很广泛。使用的语言是C。
答案 0 :(得分:1)
我说C很烦人,因为在逐行浏览文本文件时你不得不担心缓冲区大小,而且因为它没有分割功能。但是,它具有strtok()
,可用于循环在分隔符处分割字符串时获得的标记。下面的代码实现了一个函数,该函数接受一串以分号分隔的双精度数并将它们读入一个传递的double数组(使用atof()
转换为double)。你也可以传递一个起始索引(从0开始)和数字len,以获取双倍数。没有真正的错误检查,虽然如果你在抢夺len双打之前用完了令牌,它不会崩溃。包括一个简单的驱动程序功能,它在上面给出的第一行中进行了硬连接:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
void get_doubles(char* line, int start, int len, double* nums);
int main(void){
char test_string[] = "2.01; 0.441726296835717; -0.564010125045376; -0.416244141468842; -0.559920773166141; 1; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0;";
int i;
double my_nums[4];
get_doubles(test_string, 1, 4, my_nums);
for(i = 0; i < 4; i++){
printf("Number %d: %f\n",i+1,my_nums[i]);
}
return 0;
}
void get_doubles(char* line, int start, int len, double* nums){
char* token;
char delim[] = ";";
int i,j;
j = start + len;
token = strtok(line, delim);
for(i = 0; i < j && token != NULL; i++){
if(start <= i){
nums[i-start] = atof(token);
}
token = strtok(NULL,delim);
}
}
输出:
Number 1: 0.441726
Number 2: -0.564010
Number 3: -0.416244
Number 4: -0.559921
(顺便说一下 - 你没有看到精确度的损失,因为printf默认为打印双打的6位小数)