<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Beyond the Void &#187; 技术</title>
	<atom:link href="http://www.byvoid.com/blog/tag/%e6%8a%80%e6%9c%af/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.byvoid.com/blog</link>
	<description></description>
	<lastBuildDate>Tue, 29 Jun 2010 08:44:46 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Ubuntu 9.10 与 Windows 7 双系统</title>
		<link>http://www.byvoid.com/blog/ubuntu-9-10-windows-7/</link>
		<comments>http://www.byvoid.com/blog/ubuntu-9-10-windows-7/#comments</comments>
		<pubDate>Fri, 30 Oct 2009 08:40:47 +0000</pubDate>
		<dc:creator>BYVoid</dc:creator>
				<category><![CDATA[生活點滴]]></category>
		<category><![CDATA[Grub]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[引导]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[操作系统]]></category>

		<guid isPermaLink="false">http://www.byvoid.com/blog/?p=1598</guid>
		<description><![CDATA[Ubuntu 9.10 终于发布了，今天下载完立刻装了试试。不料装完以后Ubuntu的Grub占据了主MBR，而且无法引导Windows。在网上搜索多种方法，居然都无效。最后漫不经心地以root权限输入了grub-update，一切... ]]></description>
			<content:encoded><![CDATA[<p>Ubuntu 9.10 终于发布了，今天下载完立刻装了试试。不料装完以后Ubuntu的Grub占据了主MBR，而且无法引导Windows。在网上搜索多种方法，居然都无效。最后漫不经心地以root权限输入了grub-update，一切问题解决，双系统正式引导成功。</p>
<p>Ubuntu 9.10 界面有很大改善<br />
<img class="alignnone size-full wp-image-1604" title="20091102_ubuntu910" src="http://www.byvoid.com/blog/wp-content/uploads/2009/10/20091102_ubuntu910.jpg" alt="20091102_ubuntu910" width="1366" height="768" /></p>
<p>Windows 7 速度有不错提升<br />
<img class="alignnone size-full wp-image-1605" title="20091102_win7" src="http://www.byvoid.com/blog/wp-content/uploads/2009/10/20091102_win7.jpg" alt="20091102_win7" width="1366" height="768" /></p>
<h3  class="related_post_title">Maybe you like</h3><ul class="related_post"><li><a href="http://www.byvoid.com/blog/delete-peculiar-file/" title="删除顽固的文件">删除顽固的文件</a></li><li><a href="http://www.byvoid.com/blog/ubuntu-week-note/" title="Ubuntu 一周小记">Ubuntu 一周小记</a></li><li><a href="http://www.byvoid.com/blog/ibus-bopomofo-1-3-9-features/" title="ibus-pinyin注音模式新特性">ibus-pinyin注音模式新特性</a></li><li><a href="http://www.byvoid.com/blog/ubuntu-wine-wow/" title="Ubuntu下用wine玩魔兽世界">Ubuntu下用wine玩魔兽世界</a></li><li><a href="http://www.byvoid.com/blog/sglass-u1004/" title="我能吞下玻璃而不伤身体 (Ubuntu 10.04)">我能吞下玻璃而不伤身体 (Ubuntu 10.04)</a></li><li><a href="http://www.byvoid.com/blog/linux-ssh-wall/" title="Linux下实现自动设置SSH代理">Linux下实现自动设置SSH代理</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.byvoid.com/blog/ubuntu-9-10-windows-7/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Xmarks被墙</title>
		<link>http://www.byvoid.com/blog/xmarks-gfwed/</link>
		<comments>http://www.byvoid.com/blog/xmarks-gfwed/#comments</comments>
		<pubDate>Tue, 27 Oct 2009 12:42:41 +0000</pubDate>
		<dc:creator>BYVoid</dc:creator>
				<category><![CDATA[計算機技術]]></category>
		<category><![CDATA[GFW]]></category>
		<category><![CDATA[hosts]]></category>
		<category><![CDATA[Xmarks]]></category>
		<category><![CDATA[和谐]]></category>
		<category><![CDATA[墙]]></category>
		<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://www.byvoid.com/blog/?p=1596</guid>
		<description><![CDATA[Xmarks是一款优秀的书签同步软件，只是由于它新版本增加了对网站评价的功能，不巧惹了天朝，于是乎墙来也。我经常切换与多台电脑和系统之间，没有它上网简直成了一团糟。打开代理居然... ]]></description>
			<content:encoded><![CDATA[<p>Xmarks是一款优秀的书签同步软件，只是由于它新版本增加了对网站评价的功能，不巧惹了天朝，于是乎墙来也。我经常切换与多台电脑和系统之间，没有它上网简直成了一团糟。打开代理居然也无法访问，原来是DNS被河蟹了，还好我们有hosts。</p>
<blockquote><p>64.147.188.86 www.xmarks.com<br />
64.147.188.92 api.xmarks.com<br />
64.147.188.89 login.xmarks.com<br />
64.147.188.87 sync.xmarks.com<br />
64.147.188.86 static.xmarks.com<br />
64.147.188.86 download.xmarks.com<br />
64.147.188.86 my.xmarks.com</p></blockquote>
<h3  class="related_post_title">Maybe you like</h3><ul class="related_post"><li><a href="http://www.byvoid.com/blog/linux-ssh-wall/" title="Linux下实现自动设置SSH代理">Linux下实现自动设置SSH代理</a></li><li><a href="http://www.byvoid.com/blog/feedburner-no-itemlinkclicks/" title="使用FeedBurner，一定要取消链接点击统计">使用FeedBurner，一定要取消链接点击统计</a></li><li><a href="http://www.byvoid.com/blog/ubuntu-9-10-windows-7/" title="Ubuntu 9.10 与 Windows 7 双系统">Ubuntu 9.10 与 Windows 7 双系统</a></li><li><a href="http://www.byvoid.com/blog/post-declare/" title="发贴声明">发贴声明</a></li><li><a href="http://www.byvoid.com/blog/cpp-string/" title="C++ string 用法详解">C++ string 用法详解</a></li><li><a href="http://www.byvoid.com/blog/cpp-fstream/" title="C++中fstream的用法">C++中fstream的用法</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.byvoid.com/blog/xmarks-gfwed/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>C++ string 用法详解</title>
		<link>http://www.byvoid.com/blog/cpp-string/</link>
		<comments>http://www.byvoid.com/blog/cpp-string/#comments</comments>
		<pubDate>Tue, 21 Oct 2008 05:19:28 +0000</pubDate>
		<dc:creator>BYVoid</dc:creator>
				<category><![CDATA[計算機科學]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[string]]></category>
		<category><![CDATA[字符串]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[用法]]></category>

		<guid isPermaLink="false">http://www.byvoid.com/blog/?p=395</guid>
		<description><![CDATA[C++ string 详解 任何人对本文进行引用都要标明作者是Nicolai M.Josuttis /////////////////////////////////////////////////////////////////////////////////// C++ 语言是个十分优秀的语言，但优秀并不表示完美。还是有许... ]]></description>
			<content:encoded><![CDATA[<p>C++ string 详解</p>
<p>任何人对本文进行引用都要标明作者是Nicolai M.Josuttis </p>
<p>///////////////////////////////////////////////////////////////////////////////////</p>
<p>C++ 语言是个十分优秀的语言，但优秀并不表示完美。还是有许多人不愿意使用C或者C++，为什么？原因众多，其中之一就是C/C++的文本处理功能太麻烦，用起来很不方便。以前没有接触过其他语言时，每当别人这么说，我总是不屑一顾，认为他们根本就没有领会C++的精华，或者不太懂C++，现在我接触 perl, php, 和Shell脚本以后，开始理解了以前为什么有人说C++文本处理不方便了。</p>
<p><span id="more-395"></span></p>
<p>举例来说，如果文本格式是：用户名 电话号码，文件名name.txt<br />
Tom 23245332<br />
Jenny 22231231<br />
Heny 22183942<br />
Tom 23245332<br />
&#8230;</p>
<p>现在我们需要对用户名排序，且只输出不同的姓名。</p>
<p>那么在shell 编程中，可以这样用：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code37'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39537"><td class="code" id="p395code37"><pre class="cpp" style="font-family:monospace;">awk <span style="color: #FF0000;">'{print $1}'</span> name.<span style="color: #007788;">txt</span> <span style="color: #000040;">|</span> sort <span style="color: #000040;">|</span> uniq</pre></td></tr></table></div>

<p>简单吧？</p>
<p>如果使用C/C++ 就麻烦了，他需要做以下工作：<br />
先打开文件，检测文件是否打开，如果失败，则退出。<br />
声明一个足够大得二维字符数组或者一个字符指针数组<br />
读入一行到字符空间<br />
然后分析一行的结构，找到空格，存入字符数组中。<br />
关闭文件<br />
写一个排序函数，或者使用写一个比较函数，使用sort()排序<br />
遍历数组，比较是否有相同的，如果有，则要删除，copy&#8230;<br />
输出信息</p>
<p>你可以用C++或者C语言去实现这个流程。如果一个人的主要工作就是处理这种类似的文本(例如做apache的日志统计和分析),你说他会喜欢C/C++么？</p>
<p>当然，有了STL，这些处理会得到很大的简化。我们可以使用 fstream来代替麻烦的fopen fread fclose, 用vector来代替数组。最重要的是用 string来代替char * 数组，使用sort排序算法来排序，用unique 函数来去重。听起来好像很不错。看看下面代码(例程1）：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code38'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39538"><td class="code" id="p395code38"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;string&gt;</span>
<span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;algorithm&gt;</span>
<span style="color: #339900;">#include &lt;vector&gt;</span>
<span style="color: #339900;">#include &lt;fstream&gt;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	ifstream in<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;name.txt&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	string strtmp<span style="color: #008080;">;</span>
	vector<span style="color: #000080;">&lt;</span>string<span style="color: #000080;">&gt;</span> vect<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span>getline<span style="color: #008000;">&#40;</span>in, strtmp, <span style="color: #FF0000;">'<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
	vect.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>strtmp.<span style="color: #007788;">substr</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span>, strtmp.<span style="color: #007788;">find</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">' '</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	sort<span style="color: #008000;">&#40;</span>vect.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, vect.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	vector<span style="color: #000080;">&lt;</span>string<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">iterator</span> it<span style="color: #000080;">=</span>unique<span style="color: #008000;">&#40;</span>vect.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, vect.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	copy<span style="color: #008000;">&#40;</span>vect.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, it, ostream_iterator<span style="color: #000080;">&lt;</span>string<span style="color: #000080;">&gt;</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">cout</span>, <span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>也还不错吧，至少会比想象得要简单得多！（代码里面没有对错误进行处理，只是为了说明问题，不要效仿).</p>
<p>当然，在这个文本格式中，不用vector而使用map会更有扩充性，例如，还可通过人名找电话号码等等，但是使用了map就不那么好用sort了。你可以用map试一试。</p>
<p>这里string的作用不只是可以存储字符串，还可以提供字符串的比较，查找等。在sort和unique函数中就默认使用了less 和equal_to函数, 上面的一段代码，其实使用了string的以下功能：<br />
存储功能，在getline() 函数中<br />
查找功能，在find() 函数中<br />
子串功能，在substr() 函数中<br />
string operator < , 默认在sort() 函数中调用<br />
string operator == , 默认在unique() 函数中调用</p>
<p>总之，有了string 后，C++的字符文本处理功能总算得到了一定补充，加上配合STL其他容器使用，其在文本处理上的功能已经与perl, shell, php的距离缩小很多了。 因此掌握string 会让你的工作事半功倍。</p>
<p>1 string 使用</p>
<p>其实，string并不是一个单独的容器，只是basic_string 模板类的一个typedef 而已，相对应的还有wstring, 你在string 头文件中你会发现下面的代码:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code39'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39539"><td class="code" id="p395code39"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">extern</span> <span style="color: #FF0000;">&quot;C++&quot;</span> <span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">typedef</span> basic_string <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">char</span><span style="color: #000080;">&gt;</span> string<span style="color: #008080;">;</span>
<span style="color: #0000ff;">typedef</span> basic_string <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">wchar_t</span><span style="color: #000080;">&gt;</span> wstring<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span> <span style="color: #666666;">// extern &quot;C++&quot;</span></pre></td></tr></table></div>

<p>由于只是解释string的用法，如果没有特殊的说明，本文并不区分string 和 basic_string的区别。</p>
<p>string 其实相当于一个保存字符的序列容器，因此除了有字符串的一些常用操作以外，还有包含了所有的序列容器的操作。字符串的常用操作包括：增加、删除、修改、查找比较、链接、输入、输出等。详细函数列表参看附录。不要害怕这么多函数，其实有许多是序列容器带有的，平时不一定用的上。</p>
<p>如果你要想了解所有函数的详细用法，你需要查看basic_string，或者下载STL编程手册。这里通过实例介绍一些常用函数。</p>
<p>1.1 充分使用string 操作符</p>
<p>string 重载了许多操作符，包括 +, +=, <, =, , [], <<, >>等，正式这些操作符，对字符串操作非常方便。先看看下面这个例子：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code40'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39540"><td class="code" id="p395code40"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;string&gt;</span>
<span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	string strinfo<span style="color: #000080;">=</span><span style="color: #FF0000;">&quot;Please input your name:&quot;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> strinfo <span style="color: #008080;">;</span>
	<span style="color: #0000dd;">cin</span> <span style="color: #000080;">&gt;&gt;</span> strinfo<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span> strinfo <span style="color: #000080;">==</span> <span style="color: #FF0000;">&quot;winter&quot;</span> <span style="color: #008000;">&#41;</span>
		<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;you are winter!&quot;</span><span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span> strinfo <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color: #FF0000;">&quot;wende&quot;</span> <span style="color: #008000;">&#41;</span>
		<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;you are not wende!&quot;</span><span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span> strinfo <span style="color: #000080;">&lt;</span> <span style="color: #FF0000;">&quot;winter&quot;</span><span style="color: #008000;">&#41;</span>
		<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;your name should be ahead of winter&quot;</span><span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">else</span>
		<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;your name should be after of winter&quot;</span><span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
	strinfo <span style="color: #000040;">+</span><span style="color: #000080;">=</span> <span style="color: #FF0000;">&quot; , Welcome to China!&quot;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> strinfo<span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
	<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span><span style="color: #FF0000;">&quot;Your name is :&quot;</span><span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
	string strtmp <span style="color: #000080;">=</span> <span style="color: #FF0000;">&quot;How are you? &quot;</span> <span style="color: #000040;">+</span> strinfo<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span> <span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> strtmp.<span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> i <span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
		<span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span>strtmp<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>下面是程序的输出</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code41'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39541"><td class="code" id="p395code41"><pre class="cpp" style="font-family:monospace;">Please input your name<span style="color: #008080;">:</span>Hero
you are not wende<span style="color: #000040;">!</span>
Hero , Welcome to China<span style="color: #000040;">!</span>
How are you<span style="color: #008080;">?</span> Hero , Welcome to China<span style="color: #000040;">!</span></pre></td></tr></table></div>

<p>有了这些操作符，在STL中仿函数都可以直接使用string作为参数，例如 less, great, equal_to 等，因此在把string作为参数传递的时候，它的使用和int 或者float等已经没有什么区别了。例如，你可以使用：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code42'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39542"><td class="code" id="p395code42"><pre class="cpp" style="font-family:monospace;">map<span style="color: #000080;">&lt;</span>string, <span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span> mymap<span style="color: #008080;">;</span> <span style="color: #666666;">//以上默认使用了 less&lt;string&gt;</span></pre></td></tr></table></div>

<p>有了 operator + 以后，你可以直接连加，例如：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code43'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39543"><td class="code" id="p395code43"><pre class="cpp" style="font-family:monospace;">string strinfo<span style="color: #000080;">=</span><span style="color: #FF0000;">&quot;Winter&quot;</span><span style="color: #008080;">;</span>
string strlast<span style="color: #000080;">=</span><span style="color: #FF0000;">&quot;Hello &quot;</span> <span style="color: #000040;">+</span> strinfo <span style="color: #000040;">+</span> <span style="color: #FF0000;">&quot;!&quot;</span><span style="color: #008080;">;</span>
string strtest<span style="color: #000080;">=</span><span style="color: #FF0000;">&quot;Hello &quot;</span> <span style="color: #000040;">+</span> strinfo <span style="color: #000040;">+</span> <span style="color: #FF0000;">&quot; Welcome&quot;</span> <span style="color: #000040;">+</span> <span style="color: #FF0000;">&quot; to China&quot;</span> <span style="color: #000040;">+</span> <span style="color: #FF0000;">&quot; !&quot;</span><span style="color: #008080;">;</span><span style="color: #666666;">//你还可以这样：</span></pre></td></tr></table></div>

<p>看见其中的特点了吗？只要你的等式里面有一个 string 对象，你就可以一直连续&#8221;+&#8221;，但有一点需要保证的是，在开始的两项中，必须有一项是 string 对象。其原理很简单：</p>
<p>系统遇到&#8221;+&#8221;号，发现有一项是string 对象。<br />
系统把另一项转化为一个临时 string 对象。<br />
执行 operator + 操作，返回新的临时string 对象。<br />
如果又发现&#8221;+&#8221;号，继续第一步操作。</p>
<p>由于这个等式是由左到右开始检测执行，如果开始两项都是const char* ，程序自己并没有定义两个const char* 的加法，编译的时候肯定就有问题了。</p>
<p>有了操作符以后，assign(), append(), compare(), at()等函数，除非有一些特殊的需求时，一般是用不上。当然at()函数还有一个功能，那就是检查下标是否合法，如果是使用：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code44'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39544"><td class="code" id="p395code44"><pre class="cpp" style="font-family:monospace;">string str<span style="color: #000080;">=</span><span style="color: #FF0000;">&quot;winter&quot;</span><span style="color: #008080;">;</span><span style="color: #666666;">//下面一行有可能会引起程序中断错误</span>
str<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">100</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #FF0000;">'!'</span><span style="color: #008080;">;</span><span style="color: #666666;">//下面会抛出异常:throws: out_of_range</span>
<span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span>str.<span style="color: #007788;">at</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">100</span><span style="color: #008000;">&#41;</span><span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>了解了吗？如果你希望效率高，还是使用[]来访问，如果你希望稳定性好，最好使用at()来访问。</p>
<p>1.2 眼花缭乱的string find 函数</p>
<p>由于查找是使用最为频繁的功能之一，string 提供了非常丰富的查找函数。其列表如下：<br />
函数名 描述 find 查找 rfind 反向查找 find_first_of 查找包含子串中的任何字符，返回第一个位置 find_first_not_of 查找不包含子串中的任何字符，返回第一个位置 find_last_of 查找包含子串中的任何字符，返回最后一个位置 find_last_not_of 查找不包含子串中的任何字符，返回最后一个位置以上函数都是被重载了4次，以下是以find_first_of 函数为例说明他们的参数，其他函数和其参数一样，也就是说总共有24个函数 ：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code45'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39545"><td class="code" id="p395code45"><pre class="cpp" style="font-family:monospace;">size_type find_first_of<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> basic_string<span style="color: #000040;">&amp;</span> s, size_type pos <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
size_type find_first_of<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> charT<span style="color: #000040;">*</span> s, size_type pos, size_type n<span style="color: #008000;">&#41;</span>
size_type find_first_of<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> charT<span style="color: #000040;">*</span> s, size_type pos <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
size_type find_first_of<span style="color: #008000;">&#40;</span>charT c, size_type pos <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span></pre></td></tr></table></div>

<p>所有的查找函数都返回一个size_type类型，这个返回值一般都是所找到字符串的位置，如果没有找到，则返回string::npos。有一点需要特别注意，所有和string::npos的比较一定要用string::size_type来使用，不要直接使用int 或者unsigned int等类型。其实string::npos表示的是-1, 看看头文件：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code46'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39546"><td class="code" id="p395code46"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> _CharT, <span style="color: #0000ff;">class</span> _Traits, <span style="color: #0000ff;">class</span> _Alloc<span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">const</span> basic_string<span style="color: #000080;">&lt;</span>_CharT,_Traits,_Alloc<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">size_type</span>
basic_string<span style="color: #000080;">&lt;</span>_CharT,_Traits,_Alloc<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">npos</span>
<span style="color: #000080;">=</span> basic_string<span style="color: #000080;">&lt;</span>_CharT,_Traits,_Alloc<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">size_type</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>find 和 rfind 都还比较容易理解，一个是正向匹配，一个是逆向匹配，后面的参数pos都是用来指定起始查找位置。对于find_first_of 和find_last_of 就不是那么好理解。</p>
<p>find_first_of 是给定一个要查找的字符集，找到这个字符集中任何一个字符所在字符串中第一个位置。或许看一个例子更容易明白。</p>
<p>有这样一个需求：过滤一行开头和结尾的所有非英文字符。看看用string 如何实现：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code47'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39547"><td class="code" id="p395code47"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;string&gt;</span>
<span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	string strinfo<span style="color: #000080;">=</span><span style="color: #FF0000;">&quot; //*---Hello Word!......------&quot;</span><span style="color: #008080;">;</span>
	string strset<span style="color: #000080;">=</span><span style="color: #FF0000;">&quot;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz&quot;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> first <span style="color: #000080;">=</span> strinfo.<span style="color: #007788;">find_first_of</span><span style="color: #008000;">&#40;</span>strset<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>first <span style="color: #000080;">==</span> string<span style="color: #008080;">::</span><span style="color: #007788;">npos</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span><span style="color: #FF0000;">&quot;not find any characters&quot;</span><span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">return</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">int</span> last <span style="color: #000080;">=</span> strinfo.<span style="color: #007788;">find_last_of</span><span style="color: #008000;">&#40;</span>strset<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>last <span style="color: #000080;">==</span> string<span style="color: #008080;">::</span><span style="color: #007788;">npos</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span><span style="color: #FF0000;">&quot;not find any characters&quot;</span><span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">return</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> strinfo.<span style="color: #007788;">substr</span><span style="color: #008000;">&#40;</span>first, last <span style="color: #000040;">-</span> first <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>这里把所有的英文字母大小写作为了需要查找的字符集，先查找第一个英文字母的位置，然后查找最后一个英文字母的位置，然后用substr 来的到中间的一部分，用于输出结果。下面就是其结果：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code48'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39548"><td class="code" id="p395code48"><pre class="cpp" style="font-family:monospace;">Hello Word</pre></td></tr></table></div>

<p>前面的符号和后面的符号都没有了。像这种用法可以用来查找分隔符，从而把一个连续的字符串分割成为几部分，达到 shell 命令中的 awk 的用法。特别是当分隔符有多个的时候，可以一次指定。例如有这样的需求：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code49'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39549"><td class="code" id="p395code49"><pre class="cpp" style="font-family:monospace;">张三<span style="color: #000040;">|</span><span style="color: #0000dd;">3456123</span>, 湖南
李四,<span style="color: #0000dd;">4564234</span><span style="color: #000040;">|</span> 湖北
王小二, <span style="color: #0000dd;">4433253</span><span style="color: #000040;">|</span>北京
...</pre></td></tr></table></div>

<p>我们需要以 &#8220;|&#8221; &#8220;,&#8221;为分隔符，同时又要过滤空格，把每行分成相应的字段。可以作为你的一个作业来试试，要求代码简洁。</p>
<p>1.3 string insert, replace, erase</p>
<p>了解了string 的操作符，查找函数和substr，其实就已经了解了string的80%的操作了。insert函数, replace函数和erase函数在使用起来相对简单。下面以一个例子来说明其应用。<br />
string只是提供了按照位置和区间的replace函数，而不能用一个string字串来替换指定string中的另一个字串。这里写一个函数来实现这个功能：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code50'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39550"><td class="code" id="p395code50"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">void</span> string_replace<span style="color: #008000;">&#40;</span>string <span style="color: #000040;">&amp;</span> strBig, <span style="color: #0000ff;">const</span> string <span style="color: #000040;">&amp;</span> strsrc, <span style="color: #0000ff;">const</span> string <span style="color: #000040;">&amp;</span>strdst<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	string<span style="color: #008080;">::</span><span style="color: #007788;">size_type</span> pos<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	string<span style="color: #008080;">::</span><span style="color: #007788;">size_type</span> srclen<span style="color: #000080;">=</span>strsrc.<span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	string<span style="color: #008080;">::</span><span style="color: #007788;">size_type</span> dstlen<span style="color: #000080;">=</span>strdst.<span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span> <span style="color: #008000;">&#40;</span>pos<span style="color: #000080;">=</span>strBig.<span style="color: #007788;">find</span><span style="color: #008000;">&#40;</span>strsrc, pos<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">!</span><span style="color: #000080;">=</span> string<span style="color: #008080;">::</span><span style="color: #007788;">npos</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		strBig.<span style="color: #007788;">replace</span><span style="color: #008000;">&#40;</span>pos, srclen, strdst<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		pos <span style="color: #000040;">+</span><span style="color: #000080;">=</span> dstlen<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>看看如何调用：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code51'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39551"><td class="code" id="p395code51"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;string&gt;</span>
<span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	string strinfo<span style="color: #000080;">=</span><span style="color: #FF0000;">&quot;This is Winter, Winter is a programmer. Do you know Winter?&quot;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span><span style="color: #FF0000;">&quot;Orign string is :<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #000080;">&lt;&lt;</span>strinfo<span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
	string_replace<span style="color: #008000;">&#40;</span>strinfo, <span style="color: #FF0000;">&quot;Winter&quot;</span>, <span style="color: #FF0000;">&quot;wende&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">cout</span><span style="color: #000080;">&lt;&lt;</span><span style="color: #FF0000;">&quot;After replace Winter with wende, the string is :<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #000080;">&lt;&lt;</span>strinfo<span style="color: #000080;">&lt;&lt;</span>endl<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>其输出结果：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code52'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39552"><td class="code" id="p395code52"><pre class="cpp" style="font-family:monospace;">Orign string is <span style="color: #008080;">:</span>
This is Winter, Winter is a programmer. <span style="color: #007788;">Do</span> you know Winter<span style="color: #008080;">?</span>
After replace Winter with wende, the string is <span style="color: #008080;">:</span>
This is wende, wende is a programmer. <span style="color: #007788;">Do</span> you know wende<span style="color: #008080;">?</span></pre></td></tr></table></div>

<p>如果不用replace函数，则可以使用erase和insert来替换，也能实现string_replace函数的功能：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code53'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39553"><td class="code" id="p395code53"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">void</span> string_replace<span style="color: #008000;">&#40;</span>string <span style="color: #000040;">&amp;</span> strBig, <span style="color: #0000ff;">const</span> string <span style="color: #000040;">&amp;</span> strsrc, <span style="color: #0000ff;">const</span> string <span style="color: #000040;">&amp;</span>strdst<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	string<span style="color: #008080;">::</span><span style="color: #007788;">size_type</span> pos<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	string<span style="color: #008080;">::</span><span style="color: #007788;">size_type</span> srclen<span style="color: #000080;">=</span>strsrc.<span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	string<span style="color: #008080;">::</span><span style="color: #007788;">size_type</span> dstlen<span style="color: #000080;">=</span>strdst.<span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span> <span style="color: #008000;">&#40;</span>pos<span style="color: #000080;">=</span>strBig.<span style="color: #007788;">find</span><span style="color: #008000;">&#40;</span>strsrc, pos<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">!</span><span style="color: #000080;">=</span> string<span style="color: #008080;">::</span><span style="color: #007788;">npos</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		strBig.<span style="color: #007788;">erase</span><span style="color: #008000;">&#40;</span>pos, srclen<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		strBig.<span style="color: #007788;">insert</span><span style="color: #008000;">&#40;</span>pos, strdst<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		pos <span style="color: #000040;">+</span><span style="color: #000080;">=</span> dstlen<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>当然，这种方法没有使用replace来得直接。</p>
<p>2 string 和C-style字符串</p>
<p>现在看了这么多例子，发现const char* 可以和string 直接转换，例如我们在上面的例子中，使用</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code54'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39554"><td class="code" id="p395code54"><pre class="cpp" style="font-family:monospace;">string_replace<span style="color: #008000;">&#40;</span>strinfo, <span style="color: #FF0000;">&quot;Winter&quot;</span>, <span style="color: #FF0000;">&quot;wende&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>来代用<span style="color: #0000ff;">void</span> string_replace<span style="color: #008000;">&#40;</span>string <span style="color: #000040;">&amp;</span> strBig, <span style="color: #0000ff;">const</span> string <span style="color: #000040;">&amp;</span> strsrc, <span style="color: #0000ff;">const</span> string <span style="color: #000040;">&amp;</span>strdst<span style="color: #008000;">&#41;</span></pre></td></tr></table></div>

<p>在C语言中只有char* 和 const char*，为了使用起来方便，string提供了三个函数满足其要求：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code55'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39555"><td class="code" id="p395code55"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">const</span> charT<span style="color: #000040;">*</span> c_str<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">const</span>
<span style="color: #0000ff;">const</span> charT<span style="color: #000040;">*</span> data<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">const</span>
size_type copy<span style="color: #008000;">&#40;</span>charT<span style="color: #000040;">*</span> buf, size_type n, size_type pos <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">const</span></pre></td></tr></table></div>

<p>其中：<br />
c_str 直接返回一个以\0结尾的字符串。<br />
data 直接以数组方式返回string的内容，其大小为size()的返回值，结尾并没有\0字符。<br />
copy 把string的内容拷贝到buf空间中。<br />
你或许会问，c_str()的功能包含data()，那还需要data()函数干什么？看看源码：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code56'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39556"><td class="code" id="p395code56"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">const</span> charT<span style="color: #000040;">*</span> c_str <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">const</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>length <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
		<span style="color: #0000ff;">return</span> <span style="color: #FF0000;">&quot;&quot;</span><span style="color: #008080;">;</span>
	terminate <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> data <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>原来c_str()的流程是：先调用terminate()，然后在返回data()。因此如果你对效率要求比较高，而且你的处理又不一定需要以\0的方式结束，你最好选择data()。但是对于一般的C函数中，需要以const char*为输入参数，你就要使用c_str()函数。</p>
<p>对于c_str() data()函数，返回的数组都是由string本身拥有，千万不可修改其内容。其原因是许多string实现的时候采用了引用机制，也就是说，有可能几个string使用同一个字符存储空间。而且你不能使用sizeof(string)来查看其大小。详细的解释和实现查看Effective STL的条款15：小心string实现的多样性。</p>
<p>另外在你的程序中，只在需要时才使用c_str()或者data()得到字符串，每调用一次，下次再使用就会失效，如：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code57'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39557"><td class="code" id="p395code57"><pre class="cpp" style="font-family:monospace;">string strinfo<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;this is Winter&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
...
<span style="color: #666666;">//最好的方式是:</span>
foo<span style="color: #008000;">&#40;</span>strinfo.<span style="color: #007788;">c_str</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #666666;">//也可以这么用:</span>
<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span><span style="color: #000040;">*</span> pstr<span style="color: #000080;">=</span>strinfo.<span style="color: #007788;">c_str</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
foo<span style="color: #008000;">&#40;</span>pstr<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #666666;">//不要再使用了pstr了, 下面的操作已经使pstr无效了。</span>
strinfo <span style="color: #000040;">+</span><span style="color: #000080;">=</span> <span style="color: #FF0000;">&quot; Hello!&quot;</span><span style="color: #008080;">;</span>
foo<span style="color: #008000;">&#40;</span>pstr<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">//错误！</span></pre></td></tr></table></div>

<p>会遇到什么错误？当你幸运的时候pstr可能只是指向&#8221;this is Winter Hello!&#8221;的字符串，如果不幸运，就会导致程序出现其他问题，总会有一些不可遇见的错误。总之不会是你预期的那个结果。</p>
<p>3 string 和 Charactor Traits<br />
了解了string的用法，该详细看看string的真相了。前面提到string 只是basic_string的一个typedef。看看basic_string 的参数：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code58'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39558"><td class="code" id="p395code58"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> charT, <span style="color: #0000ff;">class</span> traits <span style="color: #000080;">=</span> char_traits<span style="color: #000080;">&lt;</span>charT<span style="color: #000080;">&gt;</span>,
<span style="color: #0000ff;">class</span> Allocator <span style="color: #000080;">=</span> allocator<span style="color: #000080;">&lt;</span>charT<span style="color: #000080;">&gt;</span> <span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">class</span> basic_string
<span style="color: #008000;">&#123;</span>
<span style="color: #666666;">//...</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>char_traits不仅是在basic_string 中有用，在basic_istream 和 basic_ostream中也需要用到。<br />
就像Steve Donovan在过度使用C++模板中提到的，这些确实有些过头了，要不是系统自己定义了相关的一些属性，而且用了个typedef，否则还真不知道如何使用。</p>
<p>但复杂总有复杂道理。有了char_traits，你可以定义自己的字符串类型。当然，有了char_traits < char > 和char_traits < wchar_t > 你的需求使用已经足够了，为了更好的理解string ，咱们来看看char_traits都有哪些要求。</p>
<p>如果你希望使用你自己定义的字符，你必须定义包含下列成员的结构： 表达式 描述</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code59'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39559"><td class="code" id="p395code59"><pre class="cpp" style="font-family:monospace;">char_type 字符类型
int_type <span style="color: #0000ff;">int</span> 类型
pos_type 位置类型
off_type 表示位置之间距离的类型
state_type 表示状态的类型
assign<span style="color: #008000;">&#40;</span>c1,c2<span style="color: #008000;">&#41;</span> 把字符c2赋值给c1
eq<span style="color: #008000;">&#40;</span>c1,c2<span style="color: #008000;">&#41;</span> 判断c1,c2 是否相等
lt<span style="color: #008000;">&#40;</span>c1,c2<span style="color: #008000;">&#41;</span> 判断c1是否小于c2
length<span style="color: #008000;">&#40;</span>str<span style="color: #008000;">&#41;</span> 判断str的长度
compare<span style="color: #008000;">&#40;</span>s1,s2,n<span style="color: #008000;">&#41;</span> 比较s1和s2的前n个字符
copy<span style="color: #008000;">&#40;</span>s1,s2, n<span style="color: #008000;">&#41;</span> 把s2的前n个字符拷贝到s1中
move<span style="color: #008000;">&#40;</span>s1,s2, n<span style="color: #008000;">&#41;</span> 把s2中的前n个字符移动到s1中
assign<span style="color: #008000;">&#40;</span>s,n,c<span style="color: #008000;">&#41;</span> 把s中的前n个字符赋值为c
find<span style="color: #008000;">&#40;</span>s,n,c<span style="color: #008000;">&#41;</span> 在s的前n个字符内查找c
eof<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> 返回end<span style="color: #000040;">-</span>of<span style="color: #000040;">-</span>file
to_int_type<span style="color: #008000;">&#40;</span>c<span style="color: #008000;">&#41;</span> 将c转换成int_type
to_char_type<span style="color: #008000;">&#40;</span>i<span style="color: #008000;">&#41;</span> 将i转换成char_type
not_eof<span style="color: #008000;">&#40;</span>i<span style="color: #008000;">&#41;</span> 判断i是否为<span style="color: #0000ff;">EOF</span>
eq_int_type<span style="color: #008000;">&#40;</span>i1,i2<span style="color: #008000;">&#41;</span> 判断i1和i2是否相等</pre></td></tr></table></div>

<p>想看看实际的例子，你可以看看sgi STL的char_traits结构源码.</p>
<p>现在默认的string版本中，并不支持忽略大小写的比较函数和查找函数，如果你想练练手，你可以试试改写一个char_traits , 然后生成一个case_string类, 也可以在string 上做继承，然后派生一个新的类，例如：ext_string，提供一些常用的功能，例如：</p>
<p>定义分隔符。给定分隔符，把string分为几个字段。<br />
提供替换功能。例如，用winter, 替换字符串中的wende<br />
大小写处理。例如，忽略大小写比较，转换等<br />
整形转换。例如把&#8221;123&#8243;字符串转换为123数字。<br />
这些都是常用的功能，如果你有兴趣可以试试。其实有人已经实现了，看看Extended STL string。如果你想偷懒，下载一个头文件就可以用，有了它确实方便了很多。要是有人能提供一个支持正则表达式的string，我会非常乐意用。</p>
<p>4 string 建议<br />
使用string 的方便性就不用再说了，这里要重点强调的是string的安全性。<br />
string并不是万能的，如果你在一个大工程中需要频繁处理字符串，而且有可能是多线程，那么你一定要慎重(当然，在多线程下你使用任何STL容器都要慎重)。<br />
string的实现和效率并不一定是你想象的那样，如果你对大量的字符串操作，而且特别关心其效率，那么你有两个选择，首先，你可以看看你使用的STL版本中string实现的源码；另一选择是你自己写一个只提供你需要的功能的类。<br />
string的c_str()函数是用来得到C语言风格的字符串，其返回的指针不能修改其空间。而且在下一次使用时重新调用获得新的指针。<br />
string的data()函数返回的字符串指针不会以&#8217;\0&#8242;结束，千万不可忽视。<br />
尽量去使用操作符，这样可以让程序更加易懂</p>
<p>5 小结<br />
难怪有人说：string 使用方便功能强，我们一直用它！</p>
<p>6 附录</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code60'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39560"><td class="code" id="p395code60"><pre class="cpp" style="font-family:monospace;">string 函数列表 函数名 描述
begin 得到指向字符串开头的Iterator
end 得到指向字符串结尾的Iterator
rbegin 得到指向反向字符串开头的Iterator
rend 得到指向反向字符串结尾的Iterator
size 得到字符串的大小
length 和size函数功能相同
max_size 字符串可能的最大大小
capacity 在不重新分配内存的情况下，字符串可能的大小
empty 判断是否为空
operator<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> 取第几个元素，相当于数组
c_str 取得C风格的<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span><span style="color: #000040;">*</span> 字符串
data 取得字符串内容地址
operator<span style="color: #000080;">=</span> 赋值操作符
reserve 预留空间
swap 交换函数
insert 插入字符
append 追加字符
push_back 追加字符
operator<span style="color: #000040;">+</span><span style="color: #000080;">=</span> <span style="color: #000040;">+</span><span style="color: #000080;">=</span> 操作符
erase 删除字符串
clear 清空字符容器中所有内容
resize 重新分配空间
assign 和赋值操作符一样
replace 替代
copy 字符串到空间
find 查找
rfind 反向查找
find_first_of 查找包含子串中的任何字符，返回第一个位置
find_first_not_of 查找不包含子串中的任何字符，返回第一个位置
find_last_of 查找包含子串中的任何字符，返回最后一个位置
find_last_not_of 查找不包含子串中的任何字符，返回最后一个位置
substr 得到字串
compare 比较字符串
operator<span style="color: #000040;">+</span> 字符串链接
operator<span style="color: #000080;">==</span> 判断是否相等
operator<span style="color: #000040;">!</span><span style="color: #000080;">=</span> 判断是否不等于
operator<span style="color: #000080;">&lt;</span> 判断是否小于
operator<span style="color: #000080;">&gt;&gt;</span> 从输入流中读入字符串
operator<span style="color: #000080;">&lt;&lt;</span> 字符串写入输出流
getline 从输入流中读入一行</pre></td></tr></table></div>

<p>///////////////////////////////////////////////////////////////////////////////////</p>
<p>之所以抛弃char*的字符串而选用C++标准程序库中的string类，是因为他和前者比较起来，不必担心内存是否足够、字符串长度等等，而且作为一个类出现，他集成的操作函数足以完成我们大多数情况下(甚至是100%)的需要。我们可以用 = 进行赋值操作，== 进行比较，+ 做串联（是不是很简单?）。我们尽可以把它看成是C++的基本数据类型。<br />
    好了，进入正题………<br />
首先，为了在我们的程序中使用string类型，我们必须包含头文件 <string>。如下：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code61'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39561"><td class="code" id="p395code61"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;string&gt; //注意这里不是string.h string.h是C字符串头文件</span></pre></td></tr></table></div>

<p>1．声明一个C++字符串<br />
声明一个字符串变量很简单：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code62'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39562"><td class="code" id="p395code62"><pre class="cpp" style="font-family:monospace;">string Str<span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>这样我们就声明了一个字符串变量，但既然是一个类，就有构造函数和析构函数。上面的声明没有传入参数，所以就直接使用了string的默认的构造函数，这个函数所作的就是把Str初始化为一个空字符串。String类的构造函数和析构函数如下：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code63'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39563"><td class="code" id="p395code63"><pre class="cpp" style="font-family:monospace;">a<span style="color: #008000;">&#41;</span>    string s<span style="color: #008080;">;</span>  <span style="color: #666666;">//生成一个空字符串s</span>
b<span style="color: #008000;">&#41;</span>    string s<span style="color: #008000;">&#40;</span>str<span style="color: #008000;">&#41;</span> <span style="color: #666666;">//拷贝构造函数 生成str的复制品</span>
c<span style="color: #008000;">&#41;</span>    string s<span style="color: #008000;">&#40;</span>str,stridx<span style="color: #008000;">&#41;</span> <span style="color: #666666;">//将字符串str内“始于位置stridx”的部分当作字符串的初值</span>
d<span style="color: #008000;">&#41;</span>    string s<span style="color: #008000;">&#40;</span>str,stridx,<span style="color: #0000dd;">strlen</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">//将字符串str内“始于stridx且长度顶多strlen”的部分作为字符串的初值</span>
e<span style="color: #008000;">&#41;</span>    string s<span style="color: #008000;">&#40;</span>cstr<span style="color: #008000;">&#41;</span> <span style="color: #666666;">//将C字符串作为s的初值</span>
f<span style="color: #008000;">&#41;</span>    string s<span style="color: #008000;">&#40;</span>chars,chars_len<span style="color: #008000;">&#41;</span> <span style="color: #666666;">//将C字符串前chars_len个字符作为字符串s的初值。</span>
g<span style="color: #008000;">&#41;</span>    string s<span style="color: #008000;">&#40;</span>num,c<span style="color: #008000;">&#41;</span> <span style="color: #666666;">//生成一个字符串，包含num个c字符</span>
h<span style="color: #008000;">&#41;</span>    string s<span style="color: #008000;">&#40;</span>beg,end<span style="color: #008000;">&#41;</span> <span style="color: #666666;">//以区间beg;end(不包含end)内的字符作为字符串s的初值</span>
i<span style="color: #008000;">&#41;</span>    s.~string<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">//销毁所有字符，释放内存</span></pre></td></tr></table></div>

<p>都很简单，我就不解释了。</p>
<p>2．字符串操作函数<br />
这里是C++字符串的重点，我先把各种操作函数罗列出来，不喜欢把所有函数都看完的人可以在这里找自己喜欢的函数，再到后面看他的详细解释。</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code64'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39564"><td class="code" id="p395code64"><pre class="cpp" style="font-family:monospace;">a<span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span>,assign<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>   <span style="color: #666666;">//赋以新值</span>
b<span style="color: #008000;">&#41;</span> swap<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>   <span style="color: #666666;">//交换两个字符串的内容</span>
c<span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span><span style="color: #000080;">=</span>,append<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>,push_back<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">//在尾部添加字符</span>
d<span style="color: #008000;">&#41;</span> insert<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">//插入字符</span>
e<span style="color: #008000;">&#41;</span> erase<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">//删除字符</span>
f<span style="color: #008000;">&#41;</span> clear<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">//删除全部字符</span>
g<span style="color: #008000;">&#41;</span> replace<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">//替换字符</span>
h<span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> <span style="color: #666666;">//串联字符串</span>
i<span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span>,<span style="color: #000040;">!</span><span style="color: #000080;">=</span>,<span style="color: #000080;">&lt;</span>,<span style="color: #000080;">&lt;=</span>,<span style="color: #000080;">&gt;</span>,<span style="color: #000080;">&gt;=</span>,compare<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>  <span style="color: #666666;">//比较字符串</span>
j<span style="color: #008000;">&#41;</span> size<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>,length<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>  <span style="color: #666666;">//返回字符数量</span>
k<span style="color: #008000;">&#41;</span> max_size<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">//返回字符的可能最大个数</span>
l<span style="color: #008000;">&#41;</span> empty<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>  <span style="color: #666666;">//判断字符串是否为空</span>
m<span style="color: #008000;">&#41;</span> capacity<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">//返回重新分配之前的字符容量</span>
n<span style="color: #008000;">&#41;</span> reserve<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">//保留一定量内存以容纳一定数量的字符</span>
o<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#91;</span> <span style="color: #008000;">&#93;</span>, at<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">//存取单一字符</span>
p<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&gt;&gt;</span>,getline<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">//从stream读取某值</span>
q<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span>  <span style="color: #666666;">//将谋值写入stream</span>
r<span style="color: #008000;">&#41;</span> copy<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">//将某值赋值为一个C_string</span>
s<span style="color: #008000;">&#41;</span> c_str<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">//将内容以C_string返回</span>
t<span style="color: #008000;">&#41;</span> data<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">//将内容以字符数组形式返回</span>
u<span style="color: #008000;">&#41;</span> substr<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">//返回某个子字符串</span>
v<span style="color: #008000;">&#41;</span>查找函数
w<span style="color: #008000;">&#41;</span>begin<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> end<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">//提供类似STL的迭代器支持</span>
x<span style="color: #008000;">&#41;</span> rbegin<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> rend<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">//逆向迭代器</span>
y<span style="color: #008000;">&#41;</span> get_allocator<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">//返回配置器</span></pre></td></tr></table></div>

<p>下面详细介绍：</p>
<p>2．1 C++字符串和C字符串的转换</p>
<p>    C++提供的由C++字符串得到对应的C_string的方法是使用data()、c_str()和copy()，其中，data()以字符数组的形式返回字符串内容，但并不添加’\0’。c_str()返回一个以‘\0’结尾的字符数组，而copy()则把字符串的内容复制或写入既有的c_string 或字符数组内。C++字符串并不以’\0’结尾。我的建议是在程序中能使用C++字符串就使用，除非万不得已不选用c_string。由于只是简单介绍，详细介绍掠过，谁想进一步了解使用中的注意事项可以给我留言(到我的收件箱)。我详细解释。</p>
<p>2．2 大小和容量函数<br />
    一个C++字符串存在三种大小：a)现有的字符数，函数是size()和length()，他们等效。Empty()用来检查字符串是否为空。 b)max_size() 这个大小是指当前C++字符串最多能包含的字符数，很可能和机器本身的限制或者字符串所在位置连续内存的大小有关系。我们一般情况下不用关心他，应该大小足够我们用的。但是不够用的话，会抛出length_error异常c)capacity()重新分配内存之前 string所能包含的最大字符数。这里另一个需要指出的是reserve()函数，这个函数为string重新分配内存。重新分配的大小由其参数决定，默认参数为0，这时候会对string进行非强制性缩减。</p>
<p>还有必要再重复一下C++字符串和C字符串转换的问题，许多人会遇到这样的问题，自己做的程序要调用别人的函数、类什么的（比如数据库连接函数 Connect(char*,char*)），但别人的函数参数用的是char*形式的，而我们知道，c_str()、data()返回的字符数组由该字符串拥有，所以是一种const char*,要想作为上面提及的函数的参数，还必须拷贝到一个char*,而我们的原则是能不使用C字符串就不使用。那么，这时候我们的处理方式是：如果此函数对参数(也就是char*)的内容不修改的话，我们可以这样Connect((char*)UserID.c_str(), (char*)PassWD.c_str()),但是这时候是存在危险的，因为这样转换后的字符串其实是可以修改的（有兴趣地可以自己试一试），所以我强调除非函数调用的时候不对参数进行修改，否则必须拷贝到一个char*上去。当然，更稳妥的办法是无论什么情况都拷贝到一个char*上去。同时我们也祈祷现在仍然使用C字符串进行编程的高手们（说他们是高手一点儿也不为过，也许在我们还穿开裆裤的时候他们就开始编程了，哈哈…）写的函数都比较规范，那样我们就不必进行强制转换了。</p>
<p>2．3元素存取<br />
    我们可以使用下标操作符[]和函数at()对元素包含的字符进行访问。但是应该注意的是操作符[]并不检查索引是否有效（有效索引 0~str.length()），如果索引失效，会引起未定义的行为。而at()会检查，如果使用at()的时候索引无效，会抛出 out_of_range异常。<br />
    有一个例外不得不说，const string a;的操作符[]对索引值是a.length()仍然有效，其返回值是’\0’。其他的各种情况，a.length()索引都是无效的。举例如下：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code65'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39565"><td class="code" id="p395code65"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">const</span> string Cstr<span style="color: #008000;">&#40;</span>“<span style="color: #0000ff;">const</span> string”<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
string Str<span style="color: #008000;">&#40;</span>“string”<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
Str<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>    <span style="color: #666666;">//ok</span>
Str.<span style="color: #007788;">at</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>  <span style="color: #666666;">//ok</span>
&nbsp;
Str<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">100</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span> <span style="color: #666666;">//未定义的行为</span>
Str.<span style="color: #007788;">at</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">100</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>  <span style="color: #666666;">//throw out_of_range</span>
&nbsp;
Str<span style="color: #008000;">&#91;</span>Str.<span style="color: #007788;">length</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#93;</span>  <span style="color: #666666;">//未定义行为</span>
Cstr<span style="color: #008000;">&#91;</span>Cstr.<span style="color: #007788;">length</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#93;</span> <span style="color: #666666;">//返回 ‘\0’</span>
Str.<span style="color: #007788;">at</span><span style="color: #008000;">&#40;</span>Str.<span style="color: #007788;">length</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">//throw out_of_range</span>
Cstr.<span style="color: #007788;">at</span><span style="color: #008000;">&#40;</span>Cstr.<span style="color: #007788;">length</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">////throw out_of_range</span></pre></td></tr></table></div>

<p>我不赞成类似于下面的引用或指针赋值：<br />
char&#038; r=s[2];<br />
char* p= &#038;s[3];</p>
<p>因为一旦发生重新分配，r,p立即失效。避免的方法就是不使用。</p>
<p>2．4比较函数<br />
    C++字符串支持常见的比较操作符（>,>=,<,<=,==,!=），甚至支持string与C-string的比较(如 str<”hello”)。在使用>,>=,<,<=这些操作符的时候是根据“当前字符特性”将字符按字典顺序进行逐一得比较。字典排序靠前的字符小，比较的顺序是从前向后比较，遇到不相等的字符就按这个位置上的两个字符的比较结果确定两个字符串的大小。同时，string(“aaaa”) <string(aaaaa)。<br />
    另一个功能强大的比较函数是成员函数compare()。他支持多参数处理，支持用索引值和长度定位子串来进行比较。他返回一个整数来表示比较结果，返回值意义如下：0-相等 〉0-大于 <0-小于。举例如下：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code66'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39566"><td class="code" id="p395code66"><pre class="cpp" style="font-family:monospace;">string s<span style="color: #008000;">&#40;</span>“abcd”<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
s.<span style="color: #007788;">compare</span><span style="color: #008000;">&#40;</span>“abcd”<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">//返回0</span>
s.<span style="color: #007788;">compare</span><span style="color: #008000;">&#40;</span>“dcba”<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">//返回一个小于0的值</span>
s.<span style="color: #007788;">compare</span><span style="color: #008000;">&#40;</span>“ab”<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">//返回大于0的值</span>
s.<span style="color: #007788;">compare</span><span style="color: #008000;">&#40;</span>s<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">//相等</span>
s.<span style="color: #007788;">compare</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span>,<span style="color: #0000dd;">2</span>,s,<span style="color: #0000dd;">2</span>,<span style="color: #0000dd;">2</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">//用”ab”和”cd”进行比较 小于零</span>
s.<span style="color: #007788;">compare</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span>,<span style="color: #0000dd;">2</span>,”bcx”,<span style="color: #0000dd;">2</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">//用”bc”和”bc”比较。</span></pre></td></tr></table></div>

<p>怎么样？功能够全的吧！什么？还不能满足你的胃口？好吧，那等着，后面有更个性化的比较算法。先给个提示，使用的是STL的比较算法。什么？对STL一窍不通？你重修吧！</p>
<p>2．5 更改内容<br />
这在字符串的操作中占了很大一部分。<br />
首先讲赋值，第一个赋值方法当然是使用操作符=，新值可以是string(如：s=ns) 、c_string(如：s=”gaint”)甚至单一字符（如：s=’j’）。还可以使用成员函数assign()，这个成员函数可以使你更灵活的对字符串赋值。还是举例说明吧：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code67'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39567"><td class="code" id="p395code67"><pre class="cpp" style="font-family:monospace;">s.<span style="color: #007788;">assign</span><span style="color: #008000;">&#40;</span>str<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">//直接</span>
s.<span style="color: #007788;">assign</span><span style="color: #008000;">&#40;</span>str,<span style="color: #0000dd;">1</span>,<span style="color: #0000dd;">3</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">//如果str是”iamangel” 就是把”ama”赋给字符串</span>
s.<span style="color: #007788;">assign</span><span style="color: #008000;">&#40;</span>str,<span style="color: #0000dd;">2</span>,string<span style="color: #008080;">::</span><span style="color: #007788;">npos</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">//把字符串str从索引值2开始到结尾赋给s</span>
s.<span style="color: #007788;">assign</span><span style="color: #008000;">&#40;</span>“gaint”<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">//不说</span>
s.<span style="color: #007788;">assign</span><span style="color: #008000;">&#40;</span>“nico”,<span style="color: #0000dd;">5</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">//把’n’ ‘I’ ‘c’ ‘o’ ‘\0’赋给字符串</span>
s.<span style="color: #007788;">assign</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">5</span>,’x’<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">//把五个x赋给字符串</span></pre></td></tr></table></div>

<p>把字符串清空的方法有三个：s=””;s.clear();s.erase();(我越来越觉得举例比说话让别人容易懂！)。<br />
string提供了很多函数用于插入（insert）、删除（erase）、替换（replace）、增加字符。<br />
先说增加字符（这里说的增加是在尾巴上），函数有 +=、append()、push_back()。举例如下：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code68'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39568"><td class="code" id="p395code68"><pre class="cpp" style="font-family:monospace;">s<span style="color: #000040;">+</span><span style="color: #000080;">=</span>str<span style="color: #008080;">;</span><span style="color: #666666;">//加个字符串</span>
s<span style="color: #000040;">+</span><span style="color: #000080;">=</span>”my name is jiayp”<span style="color: #008080;">;</span><span style="color: #666666;">//加个C字符串</span>
s<span style="color: #000040;">+</span><span style="color: #000080;">=</span>’a’<span style="color: #008080;">;</span><span style="color: #666666;">//加个字符</span>
&nbsp;
s.<span style="color: #007788;">append</span><span style="color: #008000;">&#40;</span>str<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
s.<span style="color: #007788;">append</span><span style="color: #008000;">&#40;</span>str,<span style="color: #0000dd;">1</span>,<span style="color: #0000dd;">3</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">//不解释了 同前面的函数参数assign的解释</span>
s.<span style="color: #007788;">append</span><span style="color: #008000;">&#40;</span>str,<span style="color: #0000dd;">2</span>,string<span style="color: #008080;">::</span><span style="color: #007788;">npos</span><span style="color: #008000;">&#41;</span><span style="color: #666666;">//不解释了</span>
&nbsp;
s.<span style="color: #007788;">append</span><span style="color: #008000;">&#40;</span>“my name is jiayp”<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
s.<span style="color: #007788;">append</span><span style="color: #008000;">&#40;</span>“nico”,<span style="color: #0000dd;">5</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
s.<span style="color: #007788;">append</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">5</span>,’x’<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
s.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span>‘a’<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">//这个函数只能增加单个字符 对STL熟悉的理解起来很简单</span></pre></td></tr></table></div>

<p>也许你需要在string中间的某个位置插入字符串，这时候你可以用insert()函数，这个函数需要你指定一个安插位置的索引，被插入的字符串将放在这个索引的后面。</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code69'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39569"><td class="code" id="p395code69"><pre class="cpp" style="font-family:monospace;">    s.<span style="color: #007788;">insert</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span>,”my name”<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    s.<span style="color: #007788;">insert</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span>,str<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>这种形式的insert()函数不支持传入单个字符，这时的单个字符必须写成字符串形式(让人恶心)。既然你觉得恶心，那就不得不继续读下面一段话：为了插入单个字符，insert()函数提供了两个对插入单个字符操作的重载函数：insert(size_type index,size_type num,chart c)和insert(iterator pos,size_type num,chart c)。其中size_type是无符号整数，iterator是char*,所以，你这么调用insert函数是不行的：insert(0,1,’j’);这时候第一个参数将转换成哪一个呢？所以你必须这么写：insert((string::size_type)0,1,’j’)！第二种形式指出了使用迭代器安插字符的形式，在后面会提及。顺便提一下，string有很多操作是使用STL的迭代器的，他也尽量做得和STL靠近。<br />
删除函数erase()的形式也有好几种（真烦！），替换函数replace()也有好几个。举例吧：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code70'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39570"><td class="code" id="p395code70"><pre class="cpp" style="font-family:monospace;">string s<span style="color: #000080;">=</span>”il8n”<span style="color: #008080;">;</span>
s.<span style="color: #007788;">replace</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span>,<span style="color: #0000dd;">2</span>,”nternationalizatio”<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">//从索引1开始的2个替换成后面的C_string</span>
s.<span style="color: #007788;">erase</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">13</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">//从索引13开始往后全删除</span>
s.<span style="color: #007788;">erase</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">7</span>,<span style="color: #0000dd;">5</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">//从索引7开始往后删5个</span></pre></td></tr></table></div>

<p>2．6提取子串和字符串连接</p>
<p>题取子串的函数是：substr(),形式如下：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code71'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39571"><td class="code" id="p395code71"><pre class="cpp" style="font-family:monospace;">s.<span style="color: #007788;">substr</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">//返回s的全部内容</span>
s.<span style="color: #007788;">substr</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">11</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">//从索引11往后的子串</span>
s.<span style="color: #007788;">substr</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">5</span>,<span style="color: #0000dd;">6</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">//从索引5开始6个字符</span></pre></td></tr></table></div>

<p>把两个字符串结合起来的函数是+。（谁不明白请致电120）</p>
<p>2．7输入输出操作<br />
1．>> 从输入流读取一个string。<br />
2．<< 把一个string写入输出流。<br />
另一个函数就是getline(),他从输入流读取一行内容，直到遇到分行符或到了文件尾。</p>
<p>2．8搜索与查找<br />
查找函数很多，功能也很强大，包括了：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p395code72'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p39572"><td class="code" id="p395code72"><pre class="cpp" style="font-family:monospace;">    find<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
    rfind<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
    find_first_of<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
    find_last_of<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
    find_first_not_of<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
    find_last_not_of<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span></pre></td></tr></table></div>

<p>这些函数返回符合搜索条件的字符区间内的第一个字符的索引，没找到目标就返回npos。所有的函数的参数说明如下：<br />
第一个参数是被搜寻的对象。第二个参数（可有可无）指出string内的搜寻起点索引，第三个参数（可有可无）指出搜寻的字符个数。比较简单，不多说 不理解的可以向我提出，我再仔细的解答。当然，更加强大的STL搜寻在后面会有提及。<br />
最后再说说npos的含义，string::npos的类型是string::size_type,所以，一旦需要把一个索引与npos相比，这个索引值必须是string::size)type类型的，更多的情况下，我们可以直接把函数和npos进行比较（如：if(s.find(“jia”)==string::npos)）。</p>
<p>任何人对本文进行引用都要标明作者是Nicolai M.Josuttis 译者是侯捷/孟岩</p>
<h3  class="related_post_title">Maybe you like</h3><ul class="related_post"><li><a href="http://www.byvoid.com/blog/string-hash-compare/" title="各种字符串Hash函数比较">各种字符串Hash函数比较</a></li><li><a href="http://www.byvoid.com/blog/cpp-fstream/" title="C++中fstream的用法">C++中fstream的用法</a></li><li><a href="http://www.byvoid.com/blog/thinking-in-delphi/" title="Thinking in Delphi：语言的变革">Thinking in Delphi：语言的变革</a></li><li><a href="http://www.byvoid.com/blog/c-string/" title="C语言字符串函数大全">C语言字符串函数大全</a></li><li><a href="http://www.byvoid.com/blog/vakuum-dev-note-02/" title="Vakuum开发笔记02 核心与安全问题">Vakuum开发笔记02 核心与安全问题</a></li><li><a href="http://www.byvoid.com/blog/fast-readfile/" title="探寻C++最快的读取文件的方案">探寻C++最快的读取文件的方案</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.byvoid.com/blog/cpp-string/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>C++中fstream的用法</title>
		<link>http://www.byvoid.com/blog/cpp-fstream/</link>
		<comments>http://www.byvoid.com/blog/cpp-fstream/#comments</comments>
		<pubDate>Thu, 17 Apr 2008 12:36:49 +0000</pubDate>
		<dc:creator>BYVoid</dc:creator>
				<category><![CDATA[計算機技術]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[fstream]]></category>
		<category><![CDATA[技巧]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[流]]></category>
		<category><![CDATA[资料]]></category>

		<guid isPermaLink="false">http://www.byvoid.com/blog/?p=124</guid>
		<description><![CDATA[ofstream是从内存到硬盘，ifstream是从硬盘到内存，其实所谓的流缓冲就是内存空间; 在C++中，有一个stream这个类，所有的I/O都以这个“流”类为基础的，包括我们要认识的文件I/O，stream这个类有... ]]></description>
			<content:encoded><![CDATA[<p>ofstream是从内存到硬盘，ifstream是从硬盘到内存，其实所谓的流缓冲就是内存空间;</p>
<p>在C++中，有一个stream这个类，所有的I/O都以这个“流”类为基础的，包括我们要认识的文件I/O，stream这个类有两个重要的运算符：</p>
<p>1、插入器(&lt;&lt;)<br />
向流输出数据。比如说系统有一个默认的标准输出流(cout)，一般情况下就是指的显示器，所以，cout&lt;&lt;&#8221;Write Stdout&#8221;&lt;&lt;&#8217;\n&#8217;;就表示把字符串&#8221;Write Stdout&#8221;和换行字符(&#8216;\n&#8217;)输出到标准输出流。</p>
<p>2、析取器(&gt;&gt;)<br />
从流中输入数据。比如说系统有一个默认的标准输入流(cin)，一般情况下就是指的键盘，所以，cin&gt;&gt;x;就表示从标准输入流中读取一个指定类型(即变量x的类型)的数据。</p>
<p><span id="more-124"></span></p>
<p>在C++中，对文件的操作是通过stream的子类fstream(file stream)来实现的，所以，要用这种方式操作文件，就必须加入头文件fstream.h。下面就把此类的文件操作过程一一道来。</p>
<p>一、打开文件<br />
在fstream类中，有一个成员函数open()，就是用来打开文件的，其原型是：</p>
<p>void open(const char* filename,int mode,int access);</p>
<p>参数：</p>
<p>filename：　　要打开的文件名<br />
mode：　　　　要打开文件的方式<br />
access：　　　打开文件的属性<br />
打开文件的方式在类ios(是所有流式I/O类的基类)中定义，常用的值如下：</p>
<p>ios::app：　　　以追加的方式打开文件<br />
ios::ate：　　　文件打开后定位到文件尾，ios:app就包含有此属性<br />
ios::binary：　以二进制方式打开文件，缺省的方式是文本方式。两种方式的区别见前文<br />
ios::in：　　　 文件以输入方式打开（文件数据输入到内存）<br />
ios::out：　　　文件以输出方式打开（内存数据输出到文件）<br />
ios::nocreate： 不建立文件，所以文件不存在时打开失败<br />
ios::noreplace：不覆盖文件，所以打开文件时如果文件存在失败<br />
ios::trunc：　　如果文件存在，把文件长度设为0<br />
可以用“或”把以上属性连接起来，如ios::out|ios::binary</p>
<p>打开文件的属性取值是：</p>
<p>0：普通文件，打开访问<br />
1：只读文件<br />
2：隐含文件<br />
4：系统文件<br />
可以用“或”或者“+”把以上属性连接起来，如3或1|2就是以只读和隐含属性打开文件。</p>
<p>例如：以二进制输入方式打开文件c:\config.sys<br />
fstream file1;<br />
file1.open(&#8220;c:\\config.sys&#8221;,ios::binary|ios::in,0);</p>
<p>如果open函数只有文件名一个参数，则是以读/写普通文件打开，即：<br />
file1.open(&#8220;c:\\config.sys&#8221;); &lt;=&gt; file1.open(&#8220;c:\\config.sys&#8221;,ios::in|ios::out,0);</p>
<p>另外，fstream还有和open()一样的构造函数，对于上例，在定义的时侯就可以打开文件了：<br />
fstream file1(&#8220;c:\\config.sys&#8221;);</p>
<p>特别提出的是，fstream有两个子类：ifstream(input file stream)和ofstream(outpu file stream)，ifstream默认以输入方式打开文件，而ofstream默认以输出方式打开文件。<br />
ifstream file2(&#8220;c:\\pdos.def&#8221;);//以输入方式打开文件<br />
ofstream file3(&#8220;c:\\x.123&#8243;);//以输出方式打开文件</p>
<p>所以，在实际应用中，根据需要的不同，选择不同的类来定义：如果想以输入方式打开，就用ifstream来定义；如果想以输出方式打开，就用ofstream来定义；如果想以输入/输出方式来打开，就用fstream来定义。</p>
<p>二、关闭文件<br />
打开的文件使用完成后一定要关闭，fstream提供了成员函数close()来完成此操作，如：file1.close();就把file1相连的文件关闭。</p>
<p>三、读写文件<br />
读写文件分为文本文件和二进制文件的读取，对于文本文件的读取比较简单，用插入器和析取器就可以了；而对于二进制的读取就要复杂些，下要就详细的介绍这两种方式</p>
<p>1、文本文件的读写<br />
文本文件的读写很简单：用插入器(&lt;&lt;)向文件输出；用析取器(&gt;&gt;)从文件输入。假设file1是以输入方式打开，file2以输出打开。示例如下：</p>
<p>file2&lt;&lt;&#8221;I Love You&#8221;;//向文件写入字符串&#8221;I Love You&#8221;<br />
int i;<br />
file1&gt;&gt;i;//从文件输入一个整数值。</p>
<p>这种方式还有一种简单的格式化能力，比如可以指定输出为16进制等等，具体的格式有以下一些</p>
<p>操纵符 功能 输入/输出<br />
dec 格式化为十进制数值数据 输入和输出<br />
endl 输出一个换行符并刷新此流 输出<br />
ends 输出一个空字符 输出<br />
hex 格式化为十六进制数值数据 输入和输出<br />
oct 格式化为八进制数值数据 输入和输出<br />
setpxecision(int p) 设置浮点数的精度位数 输出</p>
<p>比如要把123当作十六进制输出：file1&lt;&lt;hex&lt;&lt;123;要把3.1415926以5位精度输出：file1&lt;&lt;setpxecision(5)&lt;&lt;3.1415926。</p>
<p>2、二进制文件的读写<br />
①put()<br />
put()函数向流写入一个字符，其原型是ofstream &amp;put(char ch)，使用也比较简单，如file1.put(&#8216;c&#8217;);就是向流写一个字符&#8217;c'。</p>
<p>②get()<br />
get()函数比较灵活，有3种常用的重载形式：</p>
<p>一种就是和put()对应的形式：ifstream &amp;get(char &amp;ch);功能是从流中读取一个字符，结果保存在引用ch中，如果到文件尾，返回空字符。如file2.get(x);表示从文件中读取一个字符，并把读取的字符保存在x中。</p>
<p>另一种重载形式的原型是： int get();这种形式是从流中返回一个字符，如果到达文件尾，返回EOF，如x=file2.get();和上例功能是一样的。</p>
<p>还有一种形式的原型是：ifstream &amp;get(char *buf,int num,char delim=&#8217;\n&#8217;)；这种形式把字符读入由 buf 指向的数组，直到读入了 num 个字符或遇到了由 delim 指定的字符，如果没使用 delim 这个参数，将使用缺省值换行符&#8217;\n&#8217;。例如：</p>
<p>file2.get(str1,127,&#8217;A');  //从文件中读取字符到字符串str1，当遇到字符&#8217;A'或读取了127个字符时终止。</p>
<p>③读写数据块<br />
要读写二进制数据块，使用成员函数read()和write()成员函数，它们原型如下：</p>
<p>read(unsigned char *buf,int num);<br />
write(const unsigned char *buf,int num);</p>
<p>read()从文件中读取 num 个字符到 buf 指向的缓存中，如果在还未读入 num 个字符时就到了文件尾，可以用成员函数 int gcount();来取得实际读取的字符数；而 write() 从buf 指向的缓存写 num 个字符到文件中，值得注意的是缓存的类型是 unsigned char *，有时可能需要类型转换。</p>
<p>例：</p>
<p>unsigned char str1[]=&#8221;I Love You&#8221;;<br />
int n[5];<br />
ifstream in(&#8220;xxx.xxx&#8221;);<br />
ofstream out(&#8220;yyy.yyy&#8221;);<br />
out.write(str1,strlen(str1));//把字符串str1全部写到yyy.yyy中<br />
in.read((unsigned char*)n,sizeof(n));//从xxx.xxx中读取指定个整数，注意类型转换<br />
in.close();out.close();</p>
<p>四、检测EOF<br />
成员函数eof()用来检测是否到达文件尾，如果到达文件尾返回非0值，否则返回0。原型是int eof();</p>
<p>例：　　if(in.eof())  ShowMessage(&#8220;已经到达文件尾！&#8221;);</p>
<p>五、文件定位<br />
和C的文件操作方式不同的是，C++ I/O系统管理两个与一个文件相联系的指针。一个是读指针，它说明输入操作在文件中的位置；另一个是写指针，它下次写操作的位置。每次执行输入或输出时，相应的指针自动变化。所以，C++的文件定位分为读位置和写位置的定位，对应的成员函数是seekg()和seekp()。seekg()是设置读位置， seekp是设置写位置。它们最通用的形式如下：</p>
<p>istream &amp;seekg(streamoff offset,seek_dir origin);<br />
ostream &amp;seekp(streamoff offset,seek_dir origin);</p>
<p>streamoff定义于 iostream.h 中，定义有偏移量 offset 所能取得的最大值，seek_dir 表示移动的基准位置，是一个有以下值的枚举：</p>
<p>ios::beg：　　文件开头<br />
ios::cur：　　文件当前位置<br />
ios::end：　　文件结尾</p>
<p>这两个函数一般用于二进制文件，因为文本文件会因为系统对字符的解释而可能与预想的值不同。例：</p>
<p>file1.seekg(1234,ios::cur);  //把文件的读指针从当前位置向后移1234个字节<br />
file2.seekp(1234,ios::beg);  //把文件的写指针从文件开头向后移1234个字节</p>
<p>fstream的用法</p>
<p>开一个文件<br />
fstream f;<br />
f.open(&#8220;1.txt&#8221;, ios::in | ios::binary);<br />
if (!f.is_open()) // 检查文件是否成功打开<br />
cout &lt;&lt; &#8220;cannot open file.&#8221; &lt;&lt; endl;<br />
ios::in与ios::bianry均为int型，定义文件打开的方式。<br />
ios::in  &#8212; 打开文件用于读。<br />
ios::out &#8212; 打开文件用于写，如果文件不存在，则新建一个；存在则清空其内容。<br />
ios::binary &#8212; 以二进制bit流方式进行读写，默认是ios::text，但最好指定这种读写方式，即使要读写的是文本。因为在ios::text模式下，在写入时&#8217;\ n&#8217;字符将转换成两个字符：回车+换行（HEX: 0D 0A) 写入，读入时作逆转换，这容易引起不必要的麻烦。<br />
ios::app &#8212; 打开文件在文件尾进行写入，即使使用了seekp改变了写入位置，仍将在文件尾写入。<br />
ios::ate &#8212; 打开文件在文件尾进行写入，但seekp有效。</p>
<p>读写位置的改变<br />
f.seekg(0, ios::beg); // 改变读入位置 g mean Get<br />
f.seekp(0, ios::end); // 改变写入位置 p mean Put<br />
第一个参数是偏移量offset(long)，第二个参数是offset相对的位置，三个值：<br />
ios::beg &#8212; 文件头    ios::end &#8212; 文件尾    ios::cur &#8212; 当前位置</p>
<p>文件读写<br />
char s[50];<br />
f.read(s, 49);<br />
s[50] = &#8216;\0&#8242;; // 注意要自己加上字符串结束符</p>
<p>char *s = &#8220;hello&#8221;;<br />
f.write(s, strlen(s));</p>
<p>补充    记得读写完成后用f.close()关闭文件。</p>
<p>例子    下面的程序用于删除带有行号的源程序中的行号。</p>
<p><code lang="cpp" download="example.cpp" linenum="on"><br />
#include <iostream><br />
#include <fstream><br />
using namespace std;</p>
<p>//定义要删除的行号格式，下面定义的是型如: #0001 的行号<br />
const int LINE_NUM_LENGTH = 5;<br />
const char LINE_NUM_START = '#';</p>
<p>int main(int argc, char *argv[])<br />
{<br />
	fstream f;<br />
	char *s = NULL;<br />
	int n;<br />
	for (int i = 1; i < argc; i++)<br />
	{<br />
		cout << "Processing file " << argv[i] << "......";<br />
		f.open(argv[i], ios::in | ios::binary);<br />
		if (!f.is_open())<br />
		{<br />
			cout << "CANNOT OPEN"<< endl;<br />
			continue;<br />
		}<br />
		f.seekg(0, ios::end);<br />
		n = f.tellg(); // 文件大小<br />
		s = new char[n+1];<br />
		f.seekg(0, ios::beg);<br />
		f.read(s, n);<br />
		s[n] = '\0';<br />
		f.close();<br />
		// 采用一种简单的判断，遇到LINE_NUM_START后接一个数字，<br />
		// 则认为它是一个行号.<br />
		for (int j = 0; j < n; j++)<br />
		{<br />
			if (s[j] == LINE_NUM_START &#038;&#038;<br />
			(s[j+1] >= '0' &#038;&#038; s[j+1] <= '9'))<br />
			{<br />
				for (int k = j; k < j + LINE_NUM_LENGTH; k++)<br />
					s[k] = ' ';<br />
			}<br />
		}</p>
<p>		f.open(argv[i], ios::out | ios::binary);<br />
		if (!f.is_open())<br />
		{<br />
			cout << "CANNOT OPEN" << endl;<br />
			delete[] s;<br />
			continue;<br />
		}<br />
		f.write(s, n);<br />
		f.close();<br />
		cout << "OK" << endl;<br />
		delete[] s;<br />
	}<br />
	return 0;<br />
}<br />
</code></p>
<h3  class="related_post_title">Maybe you like</h3><ul class="related_post"><li><a href="http://www.byvoid.com/blog/fast-readfile/" title="探寻C++最快的读取文件的方案">探寻C++最快的读取文件的方案</a></li><li><a href="http://www.byvoid.com/blog/cpp-string/" title="C++ string 用法详解">C++ string 用法详解</a></li><li><a href="http://www.byvoid.com/blog/thinking-in-delphi/" title="Thinking in Delphi：语言的变革">Thinking in Delphi：语言的变革</a></li><li><a href="http://www.byvoid.com/blog/mcore/" title="磁芯大战">磁芯大战</a></li><li><a href="http://www.byvoid.com/blog/backgroundworker/" title="Visual C++ .Net BackgroundWorker使用">Visual C++ .Net BackgroundWorker使用</a></li><li><a href="http://www.byvoid.com/blog/c-string/" title="C语言字符串函数大全">C语言字符串函数大全</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.byvoid.com/blog/cpp-fstream/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
