c语言,sscanf的用法问题,急!

一个csv文件有两行
A,ABCDE,200,2,12.528,1,0'00'00,0,0,中国 
,,,2,13.741,2,0'02'05,20,0,英国

我用sscanf这样分了下,但是,到第二行的时候就会出问题,怎么解决?
sscanf(lineData,"%1[^,],%8[^,],%3[^,],%d,%lf,%d,%8[^,],%d,%1[^,],%6[^,]",cA, cB, cC, &dA, &dB,&dC, cD, &dD, cE, cF);

     
第二行因为前面3项是空字符,所以,全都取不出来了。这个空字符用sscanf能处理吗?
如果第二行写成[A,B,C,2,13.741,2,0'02'05,20,0,英国]这样的,把前面的补充全了就没问题了。  

从你的sscanf语句来看,每个字段的数据都应该是有长度限定的,那么当你的数据为空时,就必须有占位符才行,例如空格等。
sscanf再使用[ ]作为格式化占位符的时候,原文定义的第一句话是这么写的:
[ Matches a nonempty sequence of characters from the specified set of accepted characters
其中的nonempty sequence意思就是,不为空的序列,因此,sscanf在这里就无法满足你的需求。

正常情况下,对于此种情况,我们一般会采用特殊符号加空格的形式对数据进行分隔,而你的数据源又是来自于csv文件,所以我建议你首先对数据进行格式化,然后再进行解析,首先保障了数据的合法有效性以后,再解析就不会有问题了追问

[首先对数据进行格式化],这个的意思是?因为不想用那个变态的strtok,而且用strtok的话全部分解成字符串后还要把不是数据的再一次atoi,atof,太麻烦。      

追答

比如说,csv是全部用,进行分隔的,那么你可以把文件中所有的,先替换成 , (逗号前后空格),然后再用sscanf进行解析

追问

替换。。。。。。用什么函数呢?原谅我这只菜鸟8,谢谢  

追答

没有函数,要么你用文本编辑器自动替换功能,要么自己实现一个替换方法

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-12-20
那样写好你第一行也有问题吧。
把你问题简化一下:
第一行:s,ssss,11,11.1,ss
第二行:,sss,22,22.2,sss
那么读取就是
char cA[32] = "", cB[32] = "", cC[32] = "";
int n;
double d;
sscanf(lineData,"%[^,],%[^,],%d,%lf,%s", cA, cB, &n, %d, cC);
两行均可读取%[^,]表示读取任意长度字符的字符串直到,为止。
第2个回答  2012-12-20
不要搞那么复杂啊,简单点啊

空的可以打出来,你也可以做下实验追问

怎么打出来?那个格式化应该怎么写?   

追答

你可以查ascll 码,看空格的是什么字符,然后打印那个转意字符。
那你用用字符函数打印试试,putchar

第3个回答  2012-12-20
空字符要用getchar()消掉追问

具体说说?第二行前三项都是空的,就是说[,]号分割的话前三项都应该是长度为0的空字符串

第4个回答  2012-12-20
第二行出了什么问题?描述下。
还有,你那些变量的命名很纠结,有的取地址,有的不取,有没有问题?
第5个回答  2012-12-20
理论上应该可以啊
相似回答