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

C 如何从一个字符串中提取不同的列?,c,string,csv,scanf,C,String,Csv,Scanf,我有一个CSV文件。我成功地将所有逗号转换为空格,并将整个内容放在一个大字符串中。 当我打印字符串时,我得到如下数据: 数据1 10 0.1 550 120 140 0.121 数据2 20 0.1 250 200 0.022 数据3 30 0.1 120 330 10 0.064 数据4 40 0.1 920 380 10 0.193 等 我现在遇到了一个问题,当我把数据扫描到我的stuct数组中去保存这些数据时,它只是一次又一次地产生第一行,而忽略了其余的。所以当我打印出来时,我只得到 数据

我有一个CSV文件。我成功地将所有逗号转换为空格,并将整个内容放在一个大字符串中。 当我打印字符串时,我得到如下数据:

数据1 10 0.1 550 120 140 0.121
数据2 20 0.1 250 200 0.022
数据3 30 0.1 120 330 10 0.064
数据4 40 0.1 920 380 10 0.193

我现在遇到了一个问题,当我把数据扫描到我的stuct数组中去保存这些数据时,它只是一次又一次地产生第一行,而忽略了其余的。所以当我打印出来时,我只得到
数据1 10 0.1 550 120 140 0.121
数据1 10 0.1 550 120 140 0.121
数据1 10 0.1 550 120 140 0.121
数据1 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++;
}

有人有办法吗?C新手,请像我是5一样解释。

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

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


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

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

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);
您需要将字符串向前移动,以指向字符串中的正确位置,以便进行后续的scanf操作

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

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);
请检查如何声明和使用指针数组

正如您所说,
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);

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

请查看
sscanf()
的用法。循环中的代码似乎有问题。你说的有问题是什么意思?这毫无帮助。请看一下@Jay给出的答案。请阅读“在循环中使用sscanf()”的副本。这也是一个参数,用于不将所有内容放在一个大字符串中;而(i请查看
的用法。循环中的代码似乎有问题。你说的有问题是什么意思?这毫无帮助。请看一下@Jay给出的答案。请阅读“在循环中使用sscanf()”的副本。这也是一个参数,用于不将所有内容放在一个大字符串中;而(i
所以使用\n作为分隔符,但我实际上如何使用它来分别设置?我是否在扫描之前将其放入while循环?是的。您可以使用strtok来解析“\n”。您可以在while循环中的scanf之后添加该代码,以便第一次解析可以正常工作。请参阅,因此请使用\n作为分隔符,但我如何实际使用它来分别设置每个集合?我是否在扫描之前将其放入while循环?是的。您可以使用strtok来解析“\n”。您可以在while循环中的scanf之后添加代码,以便第一次解析可以正常工作。请参阅本文了解指针数组。好的,我这样做了,但现在每个记录都是这样的:| DATA1 STUFF1 10 0.1 550 120 140 0.121 | ATA1 ST。。。0.121 | TA1街。。。0.121 | A1 ST.…0.121 |每次都只是去掉前面的字符请阅读此内容以了解指针数组。好的,我这样做了,但现在每个记录都是这样的:| DATA1 stuff 1 10 0.1 550 120 140 0.121 | ATA1 ST。。。0.121 | TA1街。。。0.121 | A1街..0.121 |每次都只是去掉前面的字符