如何在sscanf函数中使用正则表达式来解析这个字符串

hdifilwy 2007-11-09 11:47:47
从文件中逐行读取每一行的格式为 0,3001133445,12442345345,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0
字段是用","分隔开的,后面有很多0 的字段值也可能为1。 如果用sscanf(str,"%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],"str1,str2,str3,str4......str23);这种方式每个字段都解析出来保存也可以,不过现在我只需要取得第二,第三和倒数第二个字段的值别的不需要,请问怎么写正则式可以忽略中间的那些字段,直接读取第二,第三和倒数第二个子段的值?即为这种格式:sscanf(str,"正表达式",strSeg2,strSeg3,strSeg22),因为要读取的行会很多,有几万行如果过多的无用拷贝,开销会很大,请各位帮忙看看
...全文
361 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ITsignal 2007-11-12
  • 打赏
  • 举报
回复
可以这么做,但还是比较麻烦
sscanf有个参数是 %*后接你忽略参数的类型,如%*d,就可以忽略对应字段。
但你说倒数第几个,这个还是自己写得出来嘛
sscanf(str, "%*d,......",strSeg2,strSeg3,strSeg22),
Treazy 2007-11-12
  • 打赏
  • 举报
回复
标准的C和C++都不支持正则表达式,只有在linux中,才有提供一些库去支持正则表达式
如果楼主对自己的问题还不够清楚的话,建议查阅相关资料在linux的库支持下去实现!
sxcong 2007-11-12
  • 打赏
  • 举报
回复
用","隔开的,完全可以用strtok,用不到正则吧


char *chInput="0,3001133445,12442345345,0,0,0,0,0,0,0,0, \
1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0";
char* pToken;
char seps[] = ",";
char* pItem;
int nLen;

pToken = strtok( chInput, seps );

while( pToken )
{
nLen = strlen( pToken );
if ( nLen > 0 )
{
pItem = new char[nLen +1];
memcpy( (void*)pItem, (const void*)pToken, nLen );
pItem[nLen] = 0;
//加个list,保存起来

delete []pItem;

}
pToken = strtok( NULL, seps );
}
这样提取的是字符串,然后再用atoi 转成int

试试是否可行.
jixingzhong 2007-11-12
  • 打赏
  • 举报
回复
过现在我只需要取得第二,第三和倒数第二个字段的值别的不需要
===================================================
这样也可以, 无需使用自正则:


#include <stdio.h>
#include <stdlib.h>

int main()
{
char *str="0,3001133445,12442345345,0,0,0,0,0,0,0,0, \
1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0";
char s2[20], s3[20], s22[20], tmp[20];
int index=strlen(str)-1, count=0;

sscanf(str, "%[^,],%[^,],%[^,]", tmp, s2, s3);
while(count<2)
{
if(str[index] == ',') count++;
index--;
}
sscanf(str+index+2, "%[^,]", s22);
printf("s2=%s, s3=%s, s22=%s\n", s2, s3, s22);

system("PAUSE");
return 0;
}
Treazy 2007-11-12
  • 打赏
  • 举报
回复
>>一楼的话有些奇怪。你的意思是说windows下没有支持正则表达式的库呢,还是说windows没有支持正则表达式的“标准库”而linux下有?
--------------------------------------------
我的意思是:
标准的C和C++都不支持正则表达式,而在windows下进行正则需要引入新的库(不过还得视编译器而定,有的可能已经提供了部分)
但是现在很多linux发行版本本身提供了很多函数库,直接在其环境下编译相对而言省去一些麻烦,而且在网络上这方面资料也相对较多。
^^
ITsignal 2007-11-12
  • 打赏
  • 举报
回复
就这个问题而论,似乎不用劳烦正则式;只是简单的取参数,我觉得用sscanf的参数忽略就可以了。如果linux下用正则,boost应该可以做到吧。
iambic 2007-11-12
  • 打赏
  • 举报
回复
>>标准的C和C++都不支持正则表达式,只有在linux中,才有提供一些库去支持正则表达式
一楼的话有些奇怪。你的意思是说windows下没有支持正则表达式的库呢,还是说windows没有支持正则表达式的“标准库”而linux下有?

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧