﻿<?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++博客-学以致用-专注于流媒体与网络编程开发-文章分类-C++BASE</title><link>http://www.cppblog.com/msopengl/category/15447.html</link><description>细微决定成败</description><language>zh-cn</language><lastBuildDate>Fri, 25 Nov 2011 20:20:44 GMT</lastBuildDate><pubDate>Fri, 25 Nov 2011 20:20:44 GMT</pubDate><ttl>60</ttl><item><title>7bit  编解码</title><link>http://www.cppblog.com/msopengl/articles/134600.html</link><dc:creator>jemmyLiu</dc:creator><author>jemmyLiu</author><pubDate>Thu, 25 Nov 2010 02:49:00 GMT</pubDate><guid>http://www.cppblog.com/msopengl/articles/134600.html</guid><wfw:comment>http://www.cppblog.com/msopengl/comments/134600.html</wfw:comment><comments>http://www.cppblog.com/msopengl/articles/134600.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/msopengl/comments/commentRss/134600.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/msopengl/services/trackbacks/134600.html</trackback:ping><description><![CDATA[#include &lt;iostream&gt;<br>using namespace std;<br>int&nbsp;&nbsp; gsmEncode7bit(const&nbsp;&nbsp; char*&nbsp;&nbsp; pSrc,&nbsp;&nbsp; unsigned&nbsp;&nbsp; char*&nbsp;&nbsp; pDst,&nbsp;&nbsp; int&nbsp;&nbsp; nSrcLength);&nbsp;&nbsp; <br>int&nbsp;&nbsp; gsmDecode7bit(const&nbsp;&nbsp; unsigned&nbsp;&nbsp; char*&nbsp;&nbsp; pSrc,&nbsp;&nbsp; char*&nbsp;&nbsp; pDst,&nbsp;&nbsp; int&nbsp;&nbsp; nSrcLength);&nbsp; <br>int main()<br>{<br>&nbsp;&nbsp;&nbsp; const&nbsp;&nbsp; char*&nbsp;&nbsp; ypSrc = "1";<br>&nbsp;&nbsp;&nbsp; unsigned&nbsp;&nbsp; char*&nbsp;&nbsp; ypDst;<br>&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp; ynSrcLength = sizeof ypSrc;<br><br><br>&nbsp;&nbsp;&nbsp; gsmEncode7bit(ypSrc,ypDst,ynSrcLength+1);<br><br><br>&nbsp;&nbsp;&nbsp; system("pause");<br>}<br>//&nbsp;&nbsp; 7bit编码&nbsp;&nbsp; <br>//&nbsp;&nbsp; 输入:&nbsp;&nbsp; pSrc&nbsp;&nbsp; -&nbsp;&nbsp; 源字符串指针&nbsp;&nbsp; <br>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nSrcLength&nbsp;&nbsp; -&nbsp;&nbsp; 源字符串长度&nbsp;&nbsp; <br>//&nbsp;&nbsp; 输出:&nbsp;&nbsp; pDst&nbsp;&nbsp; -&nbsp;&nbsp; 目标编码串指针&nbsp;&nbsp; <br>//&nbsp;&nbsp; 返回:&nbsp;&nbsp; 目标编码串长度&nbsp;&nbsp; <br>int&nbsp;&nbsp; gsmEncode7bit(const&nbsp;&nbsp; char*&nbsp;&nbsp; pSrc,&nbsp;&nbsp; unsigned&nbsp;&nbsp; char*&nbsp;&nbsp; pDst,&nbsp;&nbsp; int&nbsp;&nbsp; nSrcLength)&nbsp;&nbsp; <br>{&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; int&nbsp;&nbsp; nSrc; //&nbsp;&nbsp; 源字符串的计数值&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; int&nbsp;&nbsp; nDst; //&nbsp;&nbsp; 目标编码串的计数值&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; int&nbsp;&nbsp; nChar; //&nbsp;&nbsp; 当前正在处理的组内字符字节的序号，范围是0-7&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; unsigned&nbsp;&nbsp; char&nbsp;&nbsp; nLeft; //&nbsp;&nbsp; 上一字节残余的数据&nbsp;&nbsp; <br><br>&nbsp;&nbsp;&nbsp; &nbsp; //&nbsp;&nbsp; 计数值初始化&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; nSrc&nbsp;&nbsp; =&nbsp;&nbsp; 0;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; nDst&nbsp;&nbsp; =&nbsp;&nbsp; 0;&nbsp;&nbsp; <br><br>&nbsp;&nbsp;&nbsp; &nbsp; //&nbsp;&nbsp; 将源串每8个字节分为一组，压缩成7个字节&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; //&nbsp;&nbsp; 循环该处理过程，直至源串被处理完&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; //&nbsp;&nbsp; 如果分组不到8字节，也能正确处理&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; while&nbsp;&nbsp; (nSrc&nbsp;&nbsp; &lt;&nbsp;&nbsp; nSrcLength)&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; {&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; //&nbsp;&nbsp; 取源字符串的计数值的最低3位&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; nChar&nbsp;&nbsp; =&nbsp;&nbsp; nSrc&nbsp;&nbsp; &amp;&nbsp;&nbsp; 7;&nbsp;&nbsp; <br><br>&nbsp;&nbsp;&nbsp; &nbsp; //&nbsp;&nbsp; 处理源串的每个字节&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; if(nChar&nbsp;&nbsp; ==&nbsp;&nbsp; 0)&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; {&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; //&nbsp;&nbsp; 组内第一个字节，只是保存起来，待处理下一个字节时使用&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; nLeft&nbsp;&nbsp; =&nbsp;&nbsp; *pSrc;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; }&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; else&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; {&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; //&nbsp;&nbsp; 组内其它字节，将其右边部分与残余数据相加，得到一个目标编码字节&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; *pDst&nbsp;&nbsp; =&nbsp;&nbsp; (*pSrc&nbsp;&nbsp; &lt;&lt;&nbsp;&nbsp; (8-nChar))&nbsp;&nbsp; |&nbsp;&nbsp; nLeft;&nbsp;&nbsp; <br><br>&nbsp;&nbsp;&nbsp; &nbsp; //&nbsp;&nbsp; 将该字节剩下的左边部分，作为残余数据保存起来&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; nLeft&nbsp;&nbsp; =&nbsp;&nbsp; *pSrc&nbsp;&nbsp; &gt;&gt;&nbsp;&nbsp; nChar;&nbsp;&nbsp; <br><br>&nbsp;&nbsp;&nbsp; &nbsp; //&nbsp;&nbsp; 修改目标串的指针和计数值&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; pDst++;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; nDst++;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; }&nbsp;&nbsp; <br><br>&nbsp;&nbsp;&nbsp; &nbsp; //&nbsp;&nbsp; 修改源串的指针和计数值&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; pSrc++;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; nSrc++;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; }&nbsp;&nbsp; <br><br>&nbsp;&nbsp;&nbsp; &nbsp; //&nbsp;&nbsp; 返回目标串长度&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; return&nbsp;&nbsp; nDst;&nbsp;&nbsp; <br>}&nbsp;&nbsp; <br><br>//&nbsp;&nbsp; 7bit解码&nbsp;&nbsp; <br>//&nbsp;&nbsp; 输入:&nbsp;&nbsp; pSrc&nbsp;&nbsp; -&nbsp;&nbsp; 源编码串指针&nbsp;&nbsp; <br>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nSrcLength&nbsp;&nbsp; -&nbsp;&nbsp; 源编码串长度&nbsp;&nbsp; <br>//&nbsp;&nbsp; 输出:&nbsp;&nbsp; pDst&nbsp;&nbsp; -&nbsp;&nbsp; 目标字符串指针&nbsp;&nbsp; <br>//&nbsp;&nbsp; 返回:&nbsp;&nbsp; 目标字符串长度&nbsp;&nbsp; <br>int&nbsp;&nbsp; gsmDecode7bit(const&nbsp;&nbsp; unsigned&nbsp;&nbsp; char*&nbsp;&nbsp; pSrc,&nbsp;&nbsp; char*&nbsp;&nbsp; pDst,&nbsp;&nbsp; int&nbsp;&nbsp; nSrcLength)&nbsp;&nbsp; <br>{&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; int&nbsp;&nbsp; nSrc; //&nbsp;&nbsp; 源字符串的计数值&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; int&nbsp;&nbsp; nDst; //&nbsp;&nbsp; 目标解码串的计数值&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; int&nbsp;&nbsp; nByte; //&nbsp;&nbsp; 当前正在处理的组内字节的序号，范围是0-6&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; unsigned&nbsp;&nbsp; char&nbsp;&nbsp; nLeft; //&nbsp;&nbsp; 上一字节残余的数据&nbsp;&nbsp; <br><br>&nbsp;&nbsp;&nbsp; &nbsp; //&nbsp;&nbsp; 计数值初始化&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; nSrc&nbsp;&nbsp; =&nbsp;&nbsp; 0;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; nDst&nbsp;&nbsp; =&nbsp;&nbsp; 0;&nbsp;&nbsp; <br><br>&nbsp;&nbsp;&nbsp; &nbsp; //&nbsp;&nbsp; 组内字节序号和残余数据初始化&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; nByte&nbsp;&nbsp; =&nbsp;&nbsp; 0;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; nLeft&nbsp;&nbsp; =&nbsp;&nbsp; 0;&nbsp;&nbsp; <br><br>&nbsp;&nbsp;&nbsp; &nbsp; //&nbsp;&nbsp; 将源数据每7个字节分为一组，解压缩成8个字节&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; //&nbsp;&nbsp; 循环该处理过程，直至源数据被处理完&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; //&nbsp;&nbsp; 如果分组不到7字节，也能正确处理&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; while(nSrc&lt;nSrcLength)&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; {&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; //&nbsp;&nbsp; 将源字节右边部分与残余数据相加，去掉最高位，得到一个目标解码字节&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; *pDst&nbsp;&nbsp; =&nbsp;&nbsp; ((*pSrc&nbsp;&nbsp; &lt;&lt;&nbsp;&nbsp; nByte)&nbsp;&nbsp; |&nbsp;&nbsp; nLeft)&nbsp;&nbsp; &amp;&nbsp;&nbsp; 0x7f;&nbsp;&nbsp; <br><br>&nbsp;&nbsp;&nbsp; &nbsp; //&nbsp;&nbsp; 将该字节剩下的左边部分，作为残余数据保存起来&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; nLeft&nbsp;&nbsp; =&nbsp;&nbsp; *pSrc&nbsp;&nbsp; &gt;&gt;&nbsp;&nbsp; (7-nByte);&nbsp;&nbsp; <br><br>&nbsp;&nbsp;&nbsp; &nbsp; //&nbsp;&nbsp; 修改目标串的指针和计数值&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; pDst++;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; nDst++;&nbsp;&nbsp; <br><br>&nbsp;&nbsp;&nbsp; &nbsp; //&nbsp;&nbsp; 修改字节计数值&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; nByte++;&nbsp;&nbsp; <br><br>&nbsp;&nbsp;&nbsp; &nbsp; //&nbsp;&nbsp; 到了一组的最后一个字节&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; if(nByte&nbsp;&nbsp; ==&nbsp;&nbsp; 7)&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; {&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; //&nbsp;&nbsp; 额外得到一个目标解码字节&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; *pDst&nbsp;&nbsp; =&nbsp;&nbsp; nLeft;&nbsp;&nbsp; <br><br>&nbsp;&nbsp;&nbsp; &nbsp; //&nbsp;&nbsp; 修改目标串的指针和计数值&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; pDst++;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; nDst++;&nbsp;&nbsp; <br><br>&nbsp;&nbsp;&nbsp; &nbsp; //&nbsp;&nbsp; 组内字节序号和残余数据初始化&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; nByte&nbsp;&nbsp; =&nbsp;&nbsp; 0;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; nLeft&nbsp;&nbsp; =&nbsp;&nbsp; 0;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; }&nbsp;&nbsp; <br><br>&nbsp;&nbsp;&nbsp; &nbsp; //&nbsp;&nbsp; 修改源串的指针和计数值&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; pSrc++;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; nSrc++;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; }&nbsp;&nbsp; <br><br>&nbsp;&nbsp;&nbsp; &nbsp; //&nbsp;&nbsp; 输出字符串加个结束符&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; *pDst&nbsp;&nbsp; =&nbsp;&nbsp; '\0';&nbsp;&nbsp; <br><br>&nbsp;&nbsp;&nbsp; &nbsp; //&nbsp;&nbsp; 返回目标串长度&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; return&nbsp;&nbsp; nDst;&nbsp;&nbsp; <br>}<br><br><br><br><img src ="http://www.cppblog.com/msopengl/aggbug/134600.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/msopengl/" target="_blank">jemmyLiu</a> 2010-11-25 10:49 <a href="http://www.cppblog.com/msopengl/articles/134600.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>KMP算法详解（转）</title><link>http://www.cppblog.com/msopengl/articles/134106.html</link><dc:creator>jemmyLiu</dc:creator><author>jemmyLiu</author><pubDate>Fri, 19 Nov 2010 11:31:00 GMT</pubDate><guid>http://www.cppblog.com/msopengl/articles/134106.html</guid><wfw:comment>http://www.cppblog.com/msopengl/comments/134106.html</wfw:comment><comments>http://www.cppblog.com/msopengl/articles/134106.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/msopengl/comments/commentRss/134106.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/msopengl/services/trackbacks/134106.html</trackback:ping><description><![CDATA[
		<div style="width: 710px; margin: 0px; padding: 0pt 0pt 6px; border-bottom: 1px dotted rgb(79, 82, 85);">   
<br /></div>
   如果机房马上要关门了，或者你急着要和MM约会，请直接跳到第六个自然段。<br />我们这里说的KMP不是拿来放
电影的（虽然我很喜欢这个软件），而是一种算法。KMP算法是拿来处理字符串匹配的。换句话说，给你两个字符串，你需要回答，B串是否是A串的子串（A串
是否包含B串）。比如，字符串A="I'm
matrix67"，字符串B="matrix"，我们就说B是A的子串。你可以委婉地问你的MM：“假如你要向你喜欢的人表白的话，我的名字是你的告白
语中的子串吗？”<br />    解决这类问题，通常我们的方法是枚举从A串的什么位置起开始与B匹配，然后验证是否匹配。假如A串长度为n，B串长度为
m，那么这种方法的复杂度是O
(mn)的。虽然很多时候复杂度达不到mn（验证时只看头一两个字母就发现不匹配了），但我们有许多“最坏情况”，比如，A=
"aaaaaaaaaaaaaaaaaaaaaaaaaab"，B="aaaaaaaab"。我们将介绍的是一种最坏情况下O(n)的算法（这里假设
m&lt;=n），即传说中的KMP算法。<br />    之所以叫做KMP，是因为这个算法是由Knuth、Morris、Pratt三个提出来的，取
了这三个人的名字的头一个字母。这时，或许你突然明白了AVL
树为什么叫AVL，或者Bellman-Ford为什么中间是一杠不是一个点。有时一个东西有七八个人研究过，那怎么命名呢？通常这个东西干脆就不用人名
字命名了，免得发生争议，比如“3x+1问题”。扯远了。<br />    个人认为KMP是最没有必要讲的东西，因为这个东西网上能找到很多资料。但网上
的讲法基本上都涉及到“移动(shift)”、“Next函数”等概念，这非常容易产生误解（至少一年半前我看这些资料学习KMP时就没搞清楚）。在这
里，我换一种方法来解释KMP算法。<br /><br />    假如，A="abababaababacb"，B="ababacb"，我们来看看KMP
是怎么工作的。我们用两个指针i和j分别表示，A[i-j+
1..i]与B[1..j]完全相等。也就是说，i是不断增加的，随着i的增加j相应地变化，且j满足以A[i]结尾的长度为j的字符串正好匹配B串的前
j个字符（j当然越大越好），现在需要检验A[i+1]和B[j+1]的关系。当A[i+1]=B[j+1]时，i和j各加一；什么时候j=m了，我们就
说B是A的子串（B串已经整完了），并且可以根据这时的i值算出匹配的位置。当A[i+1]&lt;&gt;B[j+1]，KMP的策略是调整j的位置
（减小j值）使得A[i-j+1..i]与B[1..j]保持匹配且新的B[j+1]恰好与A[i+1]匹配（从而使得i和j能继续增加）。我们看一看当
i=j=5时的情况。<br /><br /><span style="font-family: 宋体;">    i = 1 2 3 4 <span style="color: rgb(255, 0, 0);">5</span> 6 7 8 9 ……<br />    A = a b a b <span style="color: rgb(255, 0, 0);">a</span> b a a b a b …<br />    B = a b a b <span style="color: rgb(255, 0, 0);">a</span> c b<br />    j = 1 2 3 4 <span style="color: rgb(255, 0, 0);">5</span> 6 7</span><br /><br />    此
时，A[6]&lt;&gt;B[6]。这表明，此时j不能等于5了，我们要把j改成比它小的值j'。j'可能是多少呢？仔细想一下，我们发现，j'必须
要使得B[1..j]中的头j'个字母和末j'个字母完全相等（这样j变成了j'后才能继续保持i和j的性质）。这个j'当然要越大越好。在这里，B
[1..5]="ababa"，头3个字母和末3个字母都是"aba"。而当新的j为3时，A[6]恰好和B[4]相等。于是，i变成了6，而j则变成了
4：<br /><br /><span style="font-family: 宋体;">    i = 1 2 3 4 5 <span style="color: rgb(255, 0, 0);">6</span> 7 8 9 ……<br />    A = a b a b a <span style="color: rgb(255, 0, 0);">b</span> a a b a b …<br />    B =     a b a <span style="color: rgb(255, 0, 0);">b</span> a c b<br />    j =     1 2 3 <span style="color: rgb(255, 0, 0);">4</span> 5 6 7</span><br /><br />    从
上面的这个例子，我们可以看到，新的j可以取多少与i无关，只与B串有关。我们完全可以预处理出这样一个数组P[j]，表示当匹配到B数组的第j个字母而
第j+1个字母不能匹配了时，新的j最大是多少。P[j]应该是所有满足B[1..P[j]]=B[j-P[j]+1..j]的最大值。<br />    再后来，A[7]=B[5]，i和j又各增加1。这时，又出现了A[i+1]&lt;&gt;B[j+1]的情况：<br /><br /><span style="font-family: 宋体;">    i = 1 2 3 4 5 6 <span style="color: rgb(255, 0, 0);">7</span> 8 9 ……<br />    A = a b a b a b <span style="color: rgb(255, 0, 0);">a</span> a b a b …<br />    B =     a b a b <span style="color: rgb(255, 0, 0);">a</span> c b<br />    j =     1 2 3 4 <span style="color: rgb(255, 0, 0);">5</span> 6 7</span><br /><br />    由于P[5]=3，因此新的j=3：<br /><br /><span style="font-family: 宋体;">    i = 1 2 3 4 5 6 <span style="color: rgb(255, 0, 0);">7</span> 8 9 ……<br />    A = a b a b a b <span style="color: rgb(255, 0, 0);">a</span> a b a b …<br />    B =         a b <span style="color: rgb(255, 0, 0);">a</span> b a c b<br />    j =         1 2 <span style="color: rgb(255, 0, 0);">3</span> 4 5 6 7</span><br /><br />    这时，新的j=3仍然不能满足A[i+1]=B[j+1]，此时我们再次减小j值，将j再次更新为P[3]：<br /><br /><span style="font-family: 宋体;">    i = 1 2 3 4 5 6 <span style="color: rgb(255, 0, 0);">7</span> 8 9 ……<br />    A = a b a b a b <span style="color: rgb(255, 0, 0);">a</span> a b a b …<br />    B =             <span style="color: rgb(255, 0, 0);">a</span> b a b a c b<br />    j =             <span style="color: rgb(255, 0, 0);">1</span> 2 3 4 5 6 7</span><br /><br />    现在，i还是7，j已经变成1了。而此时A[8]居然仍然不等于B[j+1]。这样，j必须减小到P[1]，即0：<br /><br /><span style="font-family: 宋体;">    i = 1 2 3 4 5 6 <span style="color: rgb(255, 0, 0);">7</span> 8 9 ……<br />    A = a b a b a b <span style="color: rgb(255, 0, 0);">a</span> a b a b …<br />    B =               a b a b a c b<br />    j =             <span style="color: rgb(255, 0, 0);">0</span> 1 2 3 4 5 6 7</span><br /><br />    终于，A[8]=B[1]，i变为8，j为1。事实上，有可能j到了0仍然不能满足A[i+1]=B[j+1]（比如A[8]="d"时）。因此，准确的说法是，当j=0了时，我们增加i值但忽略j直到出现A[i]=B[1]为止。<br />    这个过程的代码很短（真的很短），我们在这里给出：<br /><br /><code>j:=0;<br />for i:=1 to n do<br />begin<br />   while (j&gt;0) and (B[j+1]&lt;&gt;A[i]) do j:=P[j];<br />   if B[j+1]=A[i] then j:=j+1;<br />   if j=m then<br />   begin<br />      writeln('Pattern occurs with shift ',i-m);<br />      j:=P[j];<br />   end;<br />end;</code><br /><br />    最后的j:=P[j]是为了让程序继续做下去，因为我们有可能找到多处匹配。<br />    这个程序或许比想像中的要简单，因为对于i值的不断增加，代码用的是for循环。因此，这个代码可以这样形象地理解：扫描字符串A，并更新可以匹配到B的什么位置。<br /><br />    现在，我们还遗留了两个重要的问题：一，为什么这个程序是线性的；二，如何快速预处理P数组。<br />    为
什么这个程序是O(n)的？其实，主要的争议在于，while循环使得执行次数出现了不确定因素。我们将用到时间复杂度的摊还分析中的主要策略，简单地说
就是通过观察某一个变量或函数值的变化来对零散的、杂乱的、不规则的执行次数进行累计。KMP的时间复杂度分析可谓摊还分析的典型。我们从上述程序的j
值入手。每一次执行while循环都会使j减小（但不能减成负的），而另外的改变j值的地方只有第五行。每次执行了这一行，j都只能加1；因此，整个过程
中j最多加了n个1。于是，j最多只有n次减小的机会（j值减小的次数当然不能超过n，因为j永远是非负整数）。这告诉我们，while循环总共最多执行
了n次。按照摊还分析的说法，平摊到每次for循环中后，一次for循环的复杂度为O(1)。整个过程显然是O(n)的。这样的分析对于后面P数组预处理
的过程同样有效，同样可以得到预处理过程的复杂度为O(m)。<br />    预处理不需要按照P的定义写成O(m^2)甚至O(m^3)的。我们可以通
过P[1],P[2],...,P[j-1]的值来获得P[j]的值。对于刚才的B="ababacb"，假如我们已经求出了
P[1],P[2],P[3]和P[4]，看看我们应该怎么求出P[5]和P[6]。P[4]=2，那么P
[5]显然等于P[4]+1，因为由P[4]可以知道，B[1,2]已经和B[3,4]相等了，现在又有B[3]=B[5]，所以P[5]可以由P[4]
后面加一个字符得到。P[6]也等于P[5]+1吗？显然不是，因为B[ P[5]+1
]&lt;&gt;B[6]。那么，我们要考虑“退一步”了。我们考虑P[6]是否有可能由P[5]的情况所包含的子串得到，即是否P[6]=P[
P[5] ]+1。这里想不通的话可以仔细看一下：<br /><br /><span style="font-family: 宋体;">        1 2 3 4 5 6 7<br />    B = a b a b a c b<br />    P = 0 0 1 2 3 ?</span><br /><br />    P[5]=3
是因为B[1..3]和B[3..5]都是"aba"；而P[3]=1则告诉我们，B[1]、B[3]和B[5]都是"a"。既然P[6]不能由P[5]
得到，或许可以由P[3]得到（如果B[2]恰好和B[6]相等的话，P[6]就等于P[3]+1了）。显然，P[6]也不能通过P[3]得到，因为
B[2]&lt;&gt;B[6]。事实上，这样一直推到P[1]也不行，最后，我们得到，P[6]=0。<br />    怎么这个预处理过程跟前面的KMP主程序这么像呢？其实，KMP的预处理本身就是一个B串“自我匹配”的过程。它的代码和上面的代码神似：<br /><br /><code>P[1]:=0;<br />j:=0;<br />for i:=2 to m do<br />begin<br />   while (j&gt;0) and (B[j+1]&lt;&gt;B[i]) do j:=P[j];<br />   if B[j+1]=B[i] then j:=j+1;<br />   P[i]:=j;<br />end;</code><br /><br />    最后补充一点：由于KMP算法只预处理B串，因此这种算法很适合这样的问题：给定一个B串和一群不同的A串，问B是哪些A串的子串。<br /><br />    串匹配是一个很有研究价值的问题。事实上，我们还有后缀树，自动机等很多方法，这些算法都巧妙地运用了预处理，从而可以在线性的时间里解决字符串的匹配。我们以后来说。<br /><br />    昨天发现一个特别晕的事，知道怎么去掉BitComet的广告吗？把界面语言设成英文就行了。<br />    还有，金山词霸和Dr.eye都可以去自杀了，Babylon素王道。<img src ="http://www.cppblog.com/msopengl/aggbug/134106.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/msopengl/" target="_blank">jemmyLiu</a> 2010-11-19 19:31 <a href="http://www.cppblog.com/msopengl/articles/134106.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++字符串格式化符号</title><link>http://www.cppblog.com/msopengl/articles/133909.html</link><dc:creator>jemmyLiu</dc:creator><author>jemmyLiu</author><pubDate>Wed, 17 Nov 2010 11:51:00 GMT</pubDate><guid>http://www.cppblog.com/msopengl/articles/133909.html</guid><wfw:comment>http://www.cppblog.com/msopengl/comments/133909.html</wfw:comment><comments>http://www.cppblog.com/msopengl/articles/133909.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/msopengl/comments/commentRss/133909.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/msopengl/services/trackbacks/133909.html</trackback:ping><description><![CDATA[<div>
<p>
C/C++格式化字符串说明
C++的格式化字符串经常用作格式化数字的输出、字符串合并和转换等等很多场合。
</p>
<p>&nbsp;&nbsp;</p>
<p><strong>1. </strong><strong>格式化规定符</strong></p>
<p>━━━━━━━━━━━━━━━━━━━━━━━━━━ </p>
<p>&nbsp;&nbsp; 符号&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 作用</p>
<p>────────────────────────── </p>
<p>&nbsp;&nbsp;&nbsp; %d&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 十进制有符号整数</p>
<p>&nbsp;&nbsp;&nbsp; %u&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 十进制无符号整数</p>
<p>&nbsp;&nbsp;&nbsp; %f&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 浮点数</p>
<p>&nbsp;&nbsp;&nbsp; %s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 字符串</p>
<p>&nbsp;&nbsp;&nbsp; %c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 单个字符</p>
<p>&nbsp;&nbsp;&nbsp; %p&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a  href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%d6%b8%d5%eb&amp;Submit=+%cb%d1%cb%f7+">指
针</a>的值</p>
<p>&nbsp;&nbsp;&nbsp; %e&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指数形式的浮点数</p>
<p>&nbsp;&nbsp;&nbsp; %x, %X&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;无符号以十六进制表示的整数</p>
<p>&nbsp;&nbsp;&nbsp; %0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 无符号以八进制表示的整数</p>
<p>&nbsp;&nbsp;&nbsp; %g&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 自动选择合适的表示法</p>
<p>━━━━━━━━━━━━━━━━━━━━━━━━━━ </p>
<p>&nbsp;&nbsp;&nbsp; 说明: </p>
<p>&nbsp;&nbsp;&nbsp; (1). 可以在"%"和字母之间插进数字表示最大场宽。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 例如:&nbsp; %3d&nbsp;&nbsp; 表示输出3位整型数, 不够3位右对齐。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %9.2f表示输出场宽为9的浮点数, 其中小数位为2, 整数位为6, </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 小数点占一位, 不够9位右对齐。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %8s&nbsp;&nbsp; 表示输出8个字符的字符串, 不够8个字符右对齐。</p>
<p>&nbsp;&nbsp;&nbsp; 如果字符串的长度、或整型数位数超过说明的场宽, 将按其实际长度输出。但对浮点数, 若整数部分位数超过了说明的整数位宽度,
将按实际整数位输出; 若小数部分位数超过了说明的小数位宽度, 则按说明的宽度以四舍五入输出。</p>
<p>&nbsp;&nbsp;&nbsp; 另外, 若想在输出值前加一些0, 就应在场宽项前加个0。</p>
<p>&nbsp;&nbsp;&nbsp; 例如:&nbsp;&nbsp; %04d&nbsp; 表示在输出一个小于4位的数值时, 将在前面补0使其总宽度为4位。</p>
<p>&nbsp;&nbsp;&nbsp; 如果用浮点数表示字符或整型量的输出格式, 小数点后的数字代表最大宽度, 小数点前的数字代表最小宽度。</p>
<p>&nbsp;&nbsp;&nbsp; 例如: %6.9s 表示显示一个长度不小于6且不大于9的字符串。若大于9,&nbsp; 则第9个字符以后的内容将被删除。</p>
<p>&nbsp;&nbsp;&nbsp; (2). 可以在"%"和字母之间加小写字母l, 表示输出的是长型数。</p>
<p>&nbsp;&nbsp;&nbsp; 例如:&nbsp;&nbsp; %ld&nbsp;&nbsp; 表示输出long整数</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %lf&nbsp;&nbsp; 表示输出double浮点数</p>
<p>&nbsp;&nbsp;&nbsp; (3). 可以控制输出左对齐或右对齐, 即在"%"和字母之间加入一个"-" 号可说明输出为左对齐, 否则为右对齐。</p>
<p>&nbsp;&nbsp;&nbsp; 例如:&nbsp;&nbsp; %-7d&nbsp; 表示输出7位整数左对齐</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %-10s 表示输出10个字符左对齐</p>
<p><strong>&nbsp;</strong></p>
<p><strong>2. </strong><strong>一些特殊规定字符</strong></p>
<p>━━━━━━━━━━━━━━━━━━━━━━━━━━ </p>
<p>&nbsp;&nbsp;&nbsp; 字符&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 作用</p>
<p>────────────────────────── </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; \n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 换行</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; \f&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 清屏并换页</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; \r&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 回车</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; \t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Tab符</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; \xhh&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 表示一个ASCII码用16进表示, 其中hh是1到2个16进制数</p>
<p>━━━━━━━━━━━━━━━━━━━━━━━━━━ </p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char c, s[20], *p; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int a=1234, *i; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; float f=3.141592653589; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double x=0.12345678987654321; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p="How do you do"; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcpy(s, "Hello, Comrade"); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *i=12; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c='\x41'; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("a=%d\n", a);&nbsp;&nbsp;&nbsp;&nbsp; /*结果输出十进制整数a=1234*/ </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("a=%6d\n", a);&nbsp;&nbsp;&nbsp; /*结果输出6位十进制数a=&nbsp; 1234*/ </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("a=%06d\n", a);&nbsp;&nbsp; /*结果输出6位十进制数a=001234*/ </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("a=%2d\n", a);&nbsp;&nbsp;&nbsp; /*a超过2位, 按实际值输出a=1234*/ </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("*i=%4d\n", *i);&nbsp; /*输出4位十进制整数*i=&nbsp; 12*/ </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("*i=%-4d\n", *i); /*输出左对齐4位十进制整数*i=12*/ </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("i=%p\n", i);&nbsp;&nbsp;&nbsp;&nbsp; /*输出地址i=06E4*/ </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("f=%f\n", f);&nbsp;&nbsp;&nbsp;&nbsp; /*输出浮点数f=3.141593*/ </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("f=6.4f\n", f);&nbsp;&nbsp; /*输出6位其中小数点后4位的浮点数f=3.1416*/ </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("x=%lf\n", x);&nbsp;&nbsp;&nbsp; /*输出长浮点数x=0.123457*/ </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("x=%18.16lf\n",
x);/*输出18位其中小数点后16位的长浮点数x=0.1234567898765432*/ </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("c=%c\n", c);&nbsp;&nbsp;&nbsp;&nbsp; /*输出字符c=A*/ </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("c=%x\n", c);&nbsp;&nbsp;&nbsp;&nbsp; /*输出字符的ASCII码值c=41*/ </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("s[]=%s\n", s);&nbsp;&nbsp; /*输出数组字符串s[]=Hello, Comrade*/ </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("s[]=%6.9s\n", s);/*输出最多9个字符的字符串s[]=Hello,Co*/ </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("s=%p\n", s);&nbsp;&nbsp;&nbsp;&nbsp; /*输出数组字符串首字符地址s=FFBE*/ </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("*p=%s\n", p);&nbsp;&nbsp;&nbsp; /* 输出<a  href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%d6%b8%d5%eb&amp;Submit=+%cb%d1%cb%f7+">指
针</a>字符串p=How do you do*/ </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("p=%p\n", p);&nbsp;&nbsp;&nbsp;&nbsp; /*输出<a  href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%d6%b8%d5%eb&amp;Submit=+%cb%d1%cb%f7+">指
针</a>的值p=0194*/ </p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; 上面结果中的地址值在不同计算机上可能不同。</p>
</div><img src ="http://www.cppblog.com/msopengl/aggbug/133909.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/msopengl/" target="_blank">jemmyLiu</a> 2010-11-17 19:51 <a href="http://www.cppblog.com/msopengl/articles/133909.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>