一般从文件中读取内容,我会这样用。
FILE *fp = fopen(strFilePath,"r"); if (fp == NULL) { return FALSE; } char cbuff[MAX_BUFF]; memset(cbuff,0,MAX_BUFF); fgets(cbuff, MAX_BUFF, fp); sscanf(cbuff, "%s", strFileName);
就是每次从文件中取一行数据,然后用sscanf 来解析。
之前只是用来处理一些简单的数据格式,如果遇到复杂的,就先存到一个CString对象里面,再进行解析。
今天遇到了一组数据,自己就想彻底了解下sscanf 这个函数能有多大的解析能力。
网上摘录信息如下:
1. 常见用法。
char buf[512] ;
sscanf("123456 ", "%s", buf);//此处buf是数组名,它的意思是将123456以%s的形式存入buf中!
printf("%s/n", buf);
结果为:123456
2. 取指定长度的字符串。如在下例中,取最大长度为4字节的字符串。
sscanf("123456 ", "%4s", buf);
printf("%s/n", buf);
结果为:1234
3. 取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。
sscanf("123456 abcdedf", "%[^ ]", buf);
printf("%s/n", buf);
结果为:123456
4. 取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和小写字母的字符串。
sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf);
printf("%s/n", buf);
结果为:123456abcdedf
当输入:
sscanf("123456abcdedfBCDEF","%[1-9A-Z]",buf);
printf("%s/n",buf);
结果为:123456
5. 取到指定字符集为止的字符串。如在下例中,取遇到大写字母为止的字符串。
sscanf("123456abcdedfBCDEF", "%[^A-Z]", buf);
printf("%s/n", buf);
结果为:123456abcdedf
6、给定一个字符串iios/12DDWDFF@122,获取 / 和 @ 之间的字符串,先将 "iios/"过滤掉,再将非'@'的一串内容送到buf中
sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf);
printf("%s/n", buf);
结果为:12DDWDFF
7、给定一个字符串““hello, world”,仅保留world。(注意:“,”之后有一空格)
sscanf(“hello, world”, "%*s%s", buf);
printf("%s/n", buf);
结果为:world
%*s表示第一个匹配到的%s被过滤掉,即hello被过滤了
如果没有空格则结果为NULL。
这些已经是对sscanf的功能进行了非常详细的解释。但是我在遇到下面一组数据格式时,却出现了问题:
数据格式: length1=CSB024-1 CSB024-5
这是文件中的一行数据,我解析的方法是 sscanf( cbuff, "%[^=]=%s %s,strName1,strName2);
这时的数据都在cbuff里面。可是得到的结果是strName1 = strName2 = “CSB024-5”;
这就非常奇怪,而且如果这一行数据里面如果有数字,比如int,double型数据,都可以解析正确。唯独字符串解析不对!!!
经过反复实验,最后发现原来不是sscanf的问题,而是CString的问题,如果将strName1,strName2换成是char*,则就没问题。
对于这种错误,实在让人很崩溃!以后用sscanf函数解析时,先用char*类型的对象来获取,再付给CString对象吧!
补充1:
今晚快结束时,又发现一个不可理解之处:
在使用sscanf( cbuff, "%[^=]=%s,strName);时,如果strName是CString类型对象,在程序退出时会出现错误,具体错误可以自己试验。换成char*,就不会有,真是万分奇怪!!!
补充2:
今天在用到时,又加深了理解,并将其更推广到一些字符串解析领域
CString strFileName = "Oritation3D3";
“Oritation3D”是个独立的字符串,后面的数字是额外增加的后缀。这样,每次需要解析出独立的字符串,然后得到后面的后缀数字。
通过前面对 sscanf 函数的学习,我是这样使用的,虽然结果是达到了,但只是曲线求国,仍需很大改进。
CString strFileName = "Oritation3D3"; char cStrBuff[MAX_STR_BUF]; strcpy(cStrBuff, strFileName ); sscanf(cStrBuff, "%*[^D]D%d", &m_nDataNameNum);
结果: m_nDataNameNum = 3;
这样,就得到了后缀数字。