﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-天下大事， 必作于细-随笔分类-技术文档</title><link>http://www.cppblog.com/hongyoulee/category/11015.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 25 Jul 2009 21:49:43 GMT</lastBuildDate><pubDate>Sat, 25 Jul 2009 21:49:43 GMT</pubDate><ttl>60</ttl><item><title>strlen源码剖析</title><link>http://www.cppblog.com/hongyoulee/archive/2009/07/25/91126.html</link><dc:creator>友哥</dc:creator><author>友哥</author><pubDate>Sat, 25 Jul 2009 07:29:00 GMT</pubDate><guid>http://www.cppblog.com/hongyoulee/archive/2009/07/25/91126.html</guid><wfw:comment>http://www.cppblog.com/hongyoulee/comments/91126.html</wfw:comment><comments>http://www.cppblog.com/hongyoulee/archive/2009/07/25/91126.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/hongyoulee/comments/commentRss/91126.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/hongyoulee/services/trackbacks/91126.html</trackback:ping><description><![CDATA[<a href="http://www.cppblog.com/ant/archive/2007/10/12/32886.html">http://www.cppblog.com/ant/archive/2007/10/12/32886.html</a><br><a href="http://www.cppblog.com/ant/archive/2007/10/12/32886.html">http://www.cppblog.com/ant/archive/2007/10/12/32886.html</a>
<img src ="http://www.cppblog.com/hongyoulee/aggbug/91126.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/hongyoulee/" target="_blank">友哥</a> 2009-07-25 15:29 <a href="http://www.cppblog.com/hongyoulee/archive/2009/07/25/91126.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>正则表达式30分钟入门教程(正则表达式和sscanf)</title><link>http://www.cppblog.com/hongyoulee/archive/2009/06/27/88633.html</link><dc:creator>友哥</dc:creator><author>友哥</author><pubDate>Sat, 27 Jun 2009 03:21:00 GMT</pubDate><guid>http://www.cppblog.com/hongyoulee/archive/2009/06/27/88633.html</guid><wfw:comment>http://www.cppblog.com/hongyoulee/comments/88633.html</wfw:comment><comments>http://www.cppblog.com/hongyoulee/archive/2009/06/27/88633.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/hongyoulee/comments/commentRss/88633.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/hongyoulee/services/trackbacks/88633.html</trackback:ping><description><![CDATA[<p><a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm">http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm</a></p>
<p><a href="http://msdn.microsoft.com/en-us/library/28hw3sce.aspx">http://msdn.microsoft.com/en-us/library/28hw3sce.aspx</a><br><a href="http://msdn.microsoft.com/zh-cn/library/system.text.regularexpressions.regex.aspx">http://msdn.microsoft.com/zh-cn/library/system.text.regularexpressions.regex.aspx</a><br><a href="http://www.regular-expressions.info/">http://www.regular-expressions.info/</a><br><a href="http://weblogs.asp.net/whaggard/archive/2005/02/20/377025.aspx">http://weblogs.asp.net/whaggard/archive/2005/02/20/377025.aspx</a><br><a href="http://www.oreilly.com/catalog/regex2/">http://www.oreilly.com/catalog/regex2/</a></p>
<p>在看这篇文章之前建议你先了解一下什么是正则表达式，具体不重复了，google一下能出一大堆，不过这篇文章比较好，贴个url <a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm">http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm</a>，作者说30分钟能看完的不是地球人，但是我15分钟就看完了还记住了90%以上，好吧我来自火星，玩笑到此结束，下面切入正题。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本文的命题源自于这样的一个url，protocol://ip:port/chn/mode，比如说，dv://192.168.1.253:65001/1/1。如果我要解析出来各个部分，并把它们保存到各自的变量里面要怎么做？传统的C程序员会说用strtok慢慢取得各个部分，对于要转成int的用atoi，部分C++程序员也许会放弃strtok转用std::string当中的find系列成员函数（find/find_first_of...）。是的，我以前也是这么干的，两种方法都用过，当然也包括MFC里的CString的相关成员函数。现在，一种全新的方法源自于sscanf这个C语言函数。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 无论你用C还是C++，sscanf和scanf这两个函数都不会太陌生，%d %s %f甚至%02d %.2f这些东西你也很熟，看了上面我说的正则表达式，也许你会写出这么一个正则表达式：[a-zA-Z]+://(\d{1,3}\.){3}(\d{1,3}):\d{1,5}/\d{1,}/\d，没错，这个正则表达式的IP部分有点问题，但是为了描述简单，暂时就这么用了。激动人心的时候到了，我要告诉你的是scanf以及sscanf实际上是支持部分正则表达式的，当然即使是到现在我依旧不敢肯定这个部分是否是ANSI的一部分，但是我的VS2005上没有问题，朋友的VS2003上也没有问题，至于VC6实在太古老暂时找不到测试。但是顺便说一句，VS2005上你用sscanf或者scanf他会出警告的，他说这两个函数不安全建议你用sscanf_s和scanf_s，我试了下推荐的两个函数又不支持这个功能了，比较囧了。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 好了，具体说说sscanf的这个扩展功能吧（暂且这么叫）。sscanf提供的这个扩展功能其实并不能真正称为正则表达式，因为他的书写还是离不开%，而且也很局限。但是作为处理我上面说的url已经是绰绰有余了。sscanf的这个扩展功能支持[]表示支付范围，{}表示重复次数，^表示取非，*表示跳过。所以上面这个url的解析可以写成下面这个样子：</p>
<p>char url[] = "dv://192.168.1.253:65001/1/1"</p>
<p>sscanf(url,"%[^://]%*c%*c%*c%[^:]%*c%d%*c%d%*c%d",protocol,ip,port,chn,type);</p>
<p>解释一下</p>
<p>先取得一个最长的字符串，但不包括字串://，于是protocol="dv\0";</p>
<p>然后跳过三个字符（%*c），其实就是跳过://</p>
<p>接着取一个字符串不包括字符串:，于是ip=192.168.1.253，这里简化处理了，IP就当个字符串来弄，而且不做检查</p>
<p>然后跳过冒号取端口到port，再跳过/取通道号到chn，再跳过/取码流类型到type。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是不是觉得还不过瘾？我也觉得，接着举例。</p>
<p>sscanf("Phil\nChang","%[^\n]%*c%s",first_name,last_name);</p>
<p>解释：跳过一个换行符，取first_name和last_name</p>
<p>类似上面的sscanf("<a href='&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#112;&#104;&#105;&#108;&#50;&#51;&#54;&#48;&#64;&#103;&#109;&#97;&#105;&#108;&#46;&#99;&#111;&#109;&#34;&#44;&#34;&#37;&#91;&#94;&#64;&#93;&#37;&#42;&#99;&#37;&#115;&#34;&#44;&#117;&#115;&#101;&#114;&#95;&#110;&#97;&#109;&#101;&#44;&#104;&#111;&#115;&#116;'>phil2360@gmail.com","%[^@]%*c%s",user_name,host</a>);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 基本上，这个东西用的不多，但是有时候很实用，让你的代码会很简洁，但是相比正则表达式，功能又显得简陋很多，怎么用，就看个人而定了，还是那句话，不是很确定这东西是不是ANSI的，所以不考虑移植又觉得很简洁那么用吧，考虑移植那么请三思，至于正则表达式，用regex或者boost库吧，哦，我说的是C++，C#本来就带了的！</p>
<p>&nbsp;</p>
<p>本文来自CSDN博客，转载请标明出处：<a href="http://blog.csdn.net/phil2036/archive/2009/05/27/4221704.aspx">http://blog.csdn.net/phil2036/archive/2009/05/27/4221704.aspx</a><br></p>
<img src ="http://www.cppblog.com/hongyoulee/aggbug/88633.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/hongyoulee/" target="_blank">友哥</a> 2009-06-27 11:21 <a href="http://www.cppblog.com/hongyoulee/archive/2009/06/27/88633.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>