最近在寫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]); |
尼瑪一股幸福感油然而生有木有!!
【最後淡淡地鄙視國內大多數博客不經過大腦複製粘貼的行徑,太浪費我時間了
打不開
回復@一池清水-:過會再試試
回復@fffonion:打開,比較慢
回復@一池清水-:是的
最後一句話同感