C 如何从一个字符串中提取不同的列?
我有一个CSV文件。我成功地将所有逗号转换为空格,并将整个内容放在一个大字符串中。 当我打印字符串时,我得到如下数据: 数据1 10 0.1 550 120 140 0.121C 如何从一个字符串中提取不同的列?,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数组中去保存这些数据时,它只是一次又一次地产生第一行,而忽略了其余的。所以当我打印出来时,我只得到 数据
数据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 |每次都只是去掉前面的字符