C - 如何从一个字符串中提取不同的列?

时间:2017-03-31 11:45:59

标签: c string csv scanf

我有一个CSV文件。我已经设法将所有逗号转换为空格,并将整个事物放在一个大字符串中。 当我打印出字符串时,我得到这样的数据:

DATA1 STUFF1 10 0.1 550 120 140 0.121
DATA2 STUFF2 20 0.1 250 250 200 0.022
DATA3 STUFF3 30 0.1 120 330 10 0.064
DATA4 STUFF4 40 0.1 920 380 10 0.193

我目前遇到的问题是,当我将数据扫描到我的stuct数组中时,它意味着保存这些数据,它只是一遍又一遍地产生第一行,忽略其余部分。所以当我把它打印出来时,我就得到了 DATA1 STUFF1 10 0.1 550 120 140 0.121
DATA1 STUFF1 10 0.1 550 120 140 0.121
DATA1 STUFF1 10 0.1 550 120 140 0.121
DATA1 STUFF1 10 0.1 550 120 140 0.121

i=0;
while(i<MAX)
{
    sscanf(str, "%s %s %d %f %d %d %d %f", &datas[i].c1, &datas[i].c2, 
    &datas[i].n1, &datas[i].n2, &datas[i].n3, &datas[i].n4, 
    &datas[i].n5, &datas[i].n6);        
    i++;
}

MAX是CSV文件中的记录数,datas是我的结构数组,str是我存储的所有数据没有空格的字符串,我只是一个整数。

实际结构:

struct data{
    char c1[10], c2[10];
    int n1, n3, n4, n5;
    float n2, n6;
};
struct data datas[MAX];

有人有解决方案吗? C的新手,所以请像我一样解释。

2 个答案:

答案 0 :(得分:4)

通过循环的多次迭代,您传递相同的字符串(即字符串指向同一位置 - 字符串的开头),这会导致相同的值被解析。

您需要使字符串前进以指向字符串中的正确位置,以便进行后续的scanf操作。

你可以在“一组”数据末尾的字符串中使用一些分隔符,并使用strtok或类似的函数在字符串中移动。

答案 1 :(得分:1)

sscanf(str, "%s %s %d %f %d %d %d %f", &datas[i].c1, &datas[i].c2, 
    &datas[i].n1, &datas[i].n2, &datas[i].n3, &datas[i].n4, 
    &datas[i].n5, &datas[i].n6);

正如您所说,str是一个大字符串,这就是您的结构成员的内容保持不变的原因。 如果可能,请修改您的代码,使用str作为指针数组,然后使用

sscanf(str[i], "%s %s %d %f %d %d %d %f", &datas[i].c1, &datas[i].c2, 
    &datas[i].n1, &datas[i].n2, &datas[i].n3, &datas[i].n4, 
    &datas[i].n5, &datas[i].n6);

请检查如何声明和使用指针数组。