最近在写C++的 一个比赛,要求只能用标准库,tr命名空间也不能用;其中一项功能是sql语句的处理
看这个例子:
输入
update TBNAME set (C, s,ss) = (sds, sds, ds) where COL == value;
首先你不知道括号里有几个参数,最要命的是逗号之间是允许空格的;最最要命的是c++标准库里木有正则表达式支持。
想到sscanf可以简单处理字符串,就想来试试。开始是这样写的:
1 2 |
sscanf(OperationExp.c_str(), "%s%s%s(%[^)])%s(%[^)])%s%s%s%s",OpCmd,OpArg[0], OpArg[1],OpArg[2],OpArghttp://www.kagaku2.tk/wp-admin/options-general.php?page=crayon_settings[3],OpArg[4],OpArg[5],OpArg[6],OpArg[7],OpArg[8]); |
抓不出来啊有木有!!sscanf天生残疾的有木有!!看到空格就自动分割了有木有!!
最后还是在stackoverflow上看着看着找到了灵感:http://stackoverflow.com/questions/2854488/reading-a-string-with-spaces-with-sscanf
由于我不用换行,所以去掉了\n,所以最后就成了这个样子,关键是[^\t]:
1 2 |
sscanf(OperationExp.c_str(), "%s%s%s%*(%[^\t)])%s%*(%[^\t)])%s%s%s%s",OpCmd, OpArg[0],OpArg[1],OpArg[2],OpArg[3],OpArg[4],OpArg[5],OpArg[6],OpArg[7],OpArg[8]); |
虽然在g++中会出现warning:unknown conversion type character ‘(‘ in format [-Wformat]
但是程序员不怕warning只怕error所以没关系~
或者可以改得更完善(注意:sscanf处理大数据执行效率可能较低,所以应就简):
1 2 3 |
sscanf(OperationExp.c_str(), "%s%s%s%*[^(](%[^\t)])%s%*[^(](%[^\t)])%s%s%s%s", OpCmd,OpArg[0],OpArg[1],OpArg[2],OpArg[3],OpArg[4],OpArg[5],OpArg[6],OpArg[7], OpArg[8]); |
尼玛一股幸福感油然而生有木有!!
【最后淡淡地鄙视国内大多数博客不经过大脑复制粘贴的行径,太浪费我时间了