﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-花之剑'HOME-文章分类-c/c++ &amp; algorithm</title><link>http://www.blogjava.net/lantin/category/22392.html</link><description>一朵飘舞在风中的雪花，挣扎着，不想被融化。</description><language>zh-cn</language><lastBuildDate>Sun, 30 Mar 2008 16:00:35 GMT</lastBuildDate><pubDate>Sun, 30 Mar 2008 16:00:35 GMT</pubDate><ttl>60</ttl><item><title>linux下查看可执行文件的地址</title><link>http://www.blogjava.net/lantin/articles/186873.html</link><dc:creator>花之剑</dc:creator><author>花之剑</author><pubDate>Mon, 17 Mar 2008 14:08:00 GMT</pubDate><guid>http://www.blogjava.net/lantin/articles/186873.html</guid><wfw:comment>http://www.blogjava.net/lantin/comments/186873.html</wfw:comment><comments>http://www.blogjava.net/lantin/articles/186873.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lantin/comments/commentRss/186873.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lantin/services/trackbacks/186873.html</trackback:ping><description><![CDATA[objdump -d ./a.out|more<img src ="http://www.blogjava.net/lantin/aggbug/186873.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lantin/" target="_blank">花之剑</a> 2008-03-17 22:08 <a href="http://www.blogjava.net/lantin/articles/186873.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux 系统错误代码和信号的意义</title><link>http://www.blogjava.net/lantin/articles/183849.html</link><dc:creator>花之剑</dc:creator><author>花之剑</author><pubDate>Wed, 05 Mar 2008 01:59:00 GMT</pubDate><guid>http://www.blogjava.net/lantin/articles/183849.html</guid><wfw:comment>http://www.blogjava.net/lantin/comments/183849.html</wfw:comment><comments>http://www.blogjava.net/lantin/articles/183849.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lantin/comments/commentRss/183849.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lantin/services/trackbacks/183849.html</trackback:ping><description><![CDATA[
		<p>下面的列表显示常见的 Linux 系统错误代码。 <br />1 EPERM<br />Operation not permitted<br />操作不许可 <br />2 ENOENT<br />No such file or directory<br />无此文件或目录 <br />3 ESRCH<br />No such process<br />无此过程 <br />4 EINTR <br />Interrupted system call<br />系统调用被禁止 <br />5 EIO <br />I/O error<br />I/O 错误 <br />6 ENXIO <br />No such device or address<br />无此器件或地址 <br />7 E2BIG <br />Arg list too long<br />Arg 列表太长 <br />8 ENOEXEC <br />Exec format error<br />Exec 格式错误 <br />9 EBADF <br />Bad file number<br />文件数目错误<br />10 ECHILD<br />No child processes<br />无子过程<br />11 EAGAIN<br />Try again<br />再试一遍<br />12 ENOMEM<br />Out of memory <br />内存溢出<br />13 EACCES<br />Permission denied <br />许可拒绝<br />14 EFAULT<br />Bad address <br />错误的地址<br />15 ENOTBLK<br />Block device required <br />需要块设备<br />16 EBUSY<br />Device or resource busy <br />设备或资源忙<br />17 EEXIST<br />File exists <br />文件存在<br />18 EXDEV<br />Cross-device link <br />跨器链接<br />19 ENODEV<br />No such device <br />无此设备<br />20 ENOTDIR<br />Not a directory <br />不是一个目录<br />21 EISDIR<br />Is a directory <br />是一个目录<br />22 EINVAL<br />Invalid argument <br />无效的函数自变量<br />23 ENFILE<br />File table overflow <br />文件表溢出<br />24 EMFILE<br />Too many open files<br />打开的文件太多<br />25 ENOTTY<br />Inappropriate ioctl for device <br /><br />26 ETXTBSY<br />Text file busy <br />文本文件忙<br />27 EFBIG<br />File too large<br />文件太大<br />28 ENOSPC<br />No space left on device <br />磁盘空间不足<br />29 ESPIPE <br />Illegal seek <br />不合法的寻找<br />30 EROFS <br />Read-only file system <br />只读文件系统<br />31 EMLINK <br />Too many links<br />太多的链接<br /><br /><br />/* Signals.  */<br />#define SIGHUP          1       /* Hangup (POSIX).  */<br />#define SIGINT          2       /* Interrupt (ANSI).  */<br />#define SIGQUIT         3       /* Quit (POSIX).  */<br />#define SIGILL          4       /* Illegal instruction (ANSI).  */<br />#define SIGTRAP         5       /* Trace trap (POSIX).  */<br />#define SIGABRT         6       /* Abort (ANSI).  */<br />#define SIGIOT          6       /* IOT trap (4.2 BSD).  */<br />#define SIGBUS          7       /* BUS error (4.2 BSD).  */<br />#define SIGFPE          8       /* Floating-point exception (ANSI).  */<br />#define SIGKILL         9       /* Kill, unblockable (POSIX).  */<br />#define SIGUSR1         10      /* User-defined signal 1 (POSIX).  */<br />#define SIGSEGV         11      /* Segmentation violation (ANSI).  */<br />#define SIGUSR2         12      /* User-defined signal 2 (POSIX).  */<br />#define SIGPIPE         13      /* Broken pipe (POSIX).  */<br />#define SIGALRM         14      /* Alarm clock (POSIX).  */<br />#define SIGTERM         15      /* Termination (ANSI).  */<br />#define SIGSTKFLT       16      /* Stack fault.  */<br />#define SIGCLD          SIGCHLD /* Same as SIGCHLD (System V).  */<br />#define SIGCHLD         17      /* Child status has changed (POSIX).  */<br />#define SIGCONT         18      /* Continue (POSIX).  */<br />#define SIGSTOP         19      /* Stop, unblockable (POSIX).  */<br />#define SIGTSTP         20      /* Keyboard stop (POSIX).  */<br />#define SIGTTIN         21      /* Background read from tty (POSIX).  */<br />#define SIGTTOU         22      /* Background write to tty (POSIX).  */<br />#define SIGURG          23      /* Urgent condition on socket (4.2 BSD).  */<br />#define SIGXCPU         24      /* CPU limit exceeded (4.2 BSD).  */<br />#define SIGXFSZ         25      /* File size limit exceeded (4.2 BSD).  */<br />#define SIGVTALRM       26      /* Virtual alarm clock (4.2 BSD).  */<br />#define SIGPROF         27      /* Profiling alarm clock (4.2 BSD).  */<br />#define SIGWINCH        28      /* Window size change (4.3 BSD, Sun).  */<br />#define SIGPOLL         SIGIO   /* Pollable event occurred (System V).  */<br />#define SIGIO           29      /* I/O now possible (4.2 BSD).  */<br />#define SIGPWR          30      /* Power failure restart (System V).  */<br />#define SIGSYS          31      /* Bad system call.  */<br />#define SIGUNUSED       31</p>
		<p>SIGKILL和SIGTOP是不能被忽略的两个信号，他允许用户分别终止并停止任何进程。</p>
<img src ="http://www.blogjava.net/lantin/aggbug/183849.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lantin/" target="_blank">花之剑</a> 2008-03-05 09:59 <a href="http://www.blogjava.net/lantin/articles/183849.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++工作目录的相关知识</title><link>http://www.blogjava.net/lantin/articles/181020.html</link><dc:creator>花之剑</dc:creator><author>花之剑</author><pubDate>Thu, 21 Feb 2008 03:48:00 GMT</pubDate><guid>http://www.blogjava.net/lantin/articles/181020.html</guid><wfw:comment>http://www.blogjava.net/lantin/comments/181020.html</wfw:comment><comments>http://www.blogjava.net/lantin/articles/181020.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lantin/comments/commentRss/181020.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lantin/services/trackbacks/181020.html</trackback:ping><description><![CDATA[
		<p>今天学习了关于C++工作目录的相关知识<br />在写c++程序的时候，编译链接后的运行文件一般放到debug目录下面<br />而当前的工作目录却为程序文件的目录，<br />因此我们要转换工作目录到debug下，这样才方面把资源文件都放在debug下，才能方便读写文件<br />首先，我们获取当前运行文件全名<br />然后获取其目录<br />最后用chidr设置当前工作目录。<br /><br />C++中获取当前文件的全名：<br />win :GetModuleFileName()<br />linux : readlink("/proc/self/exe",szBuffer,sizeof(szBUffer));<br />获取工作目录可以用getcwd(char * workpath,int size);<br />代码如下：<br /></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080"> 1</span>
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> GetSelfFileName(</span>
				<span style="COLOR: #0000ff">char</span>
				<span style="COLOR: #000000"> szBuffer[], size_t BufferSize)<br /></span>
				<span style="COLOR: #008080"> 2</span>
				<span style="COLOR: #000000">
						<img id="Codehighlighter1_56_434_Open_Image" onclick="this.style.display='none'; Codehighlighter1_56_434_Open_Text.style.display='none'; Codehighlighter1_56_434_Closed_Image.style.display='inline'; Codehighlighter1_56_434_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_56_434_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_56_434_Closed_Text.style.display='none'; Codehighlighter1_56_434_Open_Image.style.display='inline'; Codehighlighter1_56_434_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span id="Codehighlighter1_56_434_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_56_434_Open_Text">
						<span style="COLOR: #000000">{<br /></span>
						<span style="COLOR: #008080"> 3</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> nResult  </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">false</span>
						<span style="COLOR: #000000">;<br /></span>
						<span style="COLOR: #008080"> 4</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> nRetCode </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">false</span>
						<span style="COLOR: #000000">;<br /></span>
						<span style="COLOR: #008080"> 5</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								<br />
						</span>
						<span style="COLOR: #008080"> 6</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />#ifdef _WIN32<br /></span>
						<span style="COLOR: #008080"> 7</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    nRetCode </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> (</span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000">)GetModuleFileName(NULL, szBuffer, (DWORD)BufferSize);<br /></span>
						<span style="COLOR: #008080"> 8</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000"> (</span>
						<span style="COLOR: #000000">!</span>
						<span style="COLOR: #000000">nRetCode)<br /></span>
						<span style="COLOR: #008080"> 9</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
						<span style="COLOR: #0000ff">goto</span>
						<span style="COLOR: #000000"> Exit0;<br /></span>
						<span style="COLOR: #008080">10</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">#else</span>
						<span style="COLOR: #000000">
								<br />
						</span>
						<span style="COLOR: #008080">11</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    nRetCode </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> readlink(</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">/proc/self/exe</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">, szBuffer, BufferSize);<br /></span>
						<span style="COLOR: #008080">12</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000"> ((nRetCode </span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000">) </span>
						<span style="COLOR: #000000">||</span>
						<span style="COLOR: #000000"> (nRetCode </span>
						<span style="COLOR: #000000">&gt;=</span>
						<span style="COLOR: #000000"> (</span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000">)BufferSize))<br /></span>
						<span style="COLOR: #008080">13</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
						<span style="COLOR: #0000ff">goto</span>
						<span style="COLOR: #000000"> Exit0;<br /></span>
						<span style="COLOR: #008080">14</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    szBuffer[nRetCode] </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">\0</span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">;<br /></span>
						<span style="COLOR: #008080">15</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">#endif</span>
						<span style="COLOR: #000000">
								<br />
						</span>
						<span style="COLOR: #008080">16</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								<br />
						</span>
						<span style="COLOR: #008080">17</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    nResult </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">true</span>
						<span style="COLOR: #000000">;<br /></span>
						<span style="COLOR: #008080">18</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />Exit0:<br /></span>
						<span style="COLOR: #008080">19</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> nResult;<br /></span>
						<span style="COLOR: #008080">20</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
		</div>
		<br />设置当前程序目录为工作目录方法<br />获取当天程序的全路径，去掉程序名<br />然后chidr();<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080"> 1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">  ExtractFilePath(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">szProgramPath, </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">szAppFullFileName)<br /></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #000000"><img id="Codehighlighter1_67_360_Open_Image" onclick="this.style.display='none'; Codehighlighter1_67_360_Open_Text.style.display='none'; Codehighlighter1_67_360_Closed_Image.style.display='inline'; Codehighlighter1_67_360_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_67_360_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_67_360_Closed_Text.style.display='none'; Codehighlighter1_67_360_Open_Image.style.display='inline'; Codehighlighter1_67_360_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_67_360_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_67_360_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    ASSERT(szAppFullFileName);<br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">szAppFullFileName)<br /></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #000000"><img id="Codehighlighter1_123_142_Open_Image" onclick="this.style.display='none'; Codehighlighter1_123_142_Open_Text.style.display='none'; Codehighlighter1_123_142_Closed_Image.style.display='inline'; Codehighlighter1_123_142_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_123_142_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_123_142_Closed_Text.style.display='none'; Codehighlighter1_123_142_Open_Image.style.display='inline'; Codehighlighter1_123_142_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span id="Codehighlighter1_123_142_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_123_142_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    <br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pBUffer </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> szAppFullFileName;<br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> len </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> strlen(pBUffer)</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(pBUffer[len] </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">\\</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">)<br /></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img id="Codehighlighter1_244_274_Open_Image" onclick="this.style.display='none'; Codehighlighter1_244_274_Open_Text.style.display='none'; Codehighlighter1_244_274_Closed_Image.style.display='inline'; Codehighlighter1_244_274_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_244_274_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_244_274_Closed_Text.style.display='none'; Codehighlighter1_244_274_Open_Image.style.display='inline'; Codehighlighter1_244_274_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span id="Codehighlighter1_244_274_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_244_274_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        pBUffer[len</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">\0</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    pBUffer[len] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">\0</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    memcpy(szProgramPath,szAppFullFileName,len);<br /></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">20</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div><br /><br /><br />在对文件进行操作时候 要切换根目录<img src ="http://www.blogjava.net/lantin/aggbug/181020.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lantin/" target="_blank">花之剑</a> 2008-02-21 11:48 <a href="http://www.blogjava.net/lantin/articles/181020.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GDB调试完全解析 转</title><link>http://www.blogjava.net/lantin/articles/180457.html</link><dc:creator>花之剑</dc:creator><author>花之剑</author><pubDate>Mon, 18 Feb 2008 06:02:00 GMT</pubDate><guid>http://www.blogjava.net/lantin/articles/180457.html</guid><wfw:comment>http://www.blogjava.net/lantin/comments/180457.html</wfw:comment><comments>http://www.blogjava.net/lantin/articles/180457.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lantin/comments/commentRss/180457.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lantin/services/trackbacks/180457.html</trackback:ping><description><![CDATA[
		<div class="tit">用GDB调试程序一</div>
		<div class="date">2007-06-18 18:13</div>
		<table style="TABLE-LAYOUT: fixed">
				<tbody>
						<tr>
								<td>
										<div class="cnt">
												<p>GDB是一个强大的命令行调试工具。大家知道命令行的强大就是在于，其可以形成执行序列，形成脚本。UNIX下的软件全是命令行的，这给程序开发提代供了极大的便利，命令行软件的优势在于，它们可以非常容易的集成在一起，使用几个简单的已有工具的命令，就可以做出一个非常强大的功能。<br /><br />于是UNIX下的软件比Windows下的软件更能有机地结合，各自发挥各自的长处，组合成更为强劲的功能。而Windows下的图形软件基本上是各自为营，互相不能调用，很不利于各种软件的相互集成。在这里并不是要和Windows做个什么比较，所谓“寸有所长，尺有所短”，图形化工具还是有不如命令行的地方。</p>
												<a name="more">
												</a>
												<p>用GDB调试程序</p>
												<p>GDB概述<br />————</p>
												<p>GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许，各位比较喜欢那种图形界面方式的，像VC、BCB等IDE的调试，但如果你是在UNIX平台下做软件，你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长，尺有所短”就是这个道理。</p>
												<p>一般来说，GDB主要帮忙你完成下面四个方面的功能：</p>
												<p>1、启动你的程序，可以按照你的自定义的要求随心所欲的运行程序。<br />2、可让被调试的程序在你所指定的调置的断点处停住。（断点可以是条件表达式）<br />3、当程序被停住时，可以检查此时你的程序中所发生的事。<br />4、动态的改变你程序的执行环境。</p>
												<p>从上面看来，GDB和一般的调试工具没有什么两样，基本上也是完成这些功能，不过在细节上，你会发现GDB这个调试工具的强大，大家可能比较习惯了图形化的调试工具，但有时候，命令行的调试工具却有着图形化工具所不能完成的功能。让我们一一看来。</p>
												<p>一个调试示例<br />——————</p>
												<p>源程序：tst.c</p>
												<p>1 #include <stdio.h></stdio.h><br />2<br />3 int func(int n)<br />4 {<br />5 int sum=0,i;<br />6 for(i=0; i<n></n><br />7 {<br />8 sum+=i;<br />9 }<br />10 return sum;<br />11 }<br />12<br />13<br />14 main()<br />15 {<br />16 int i;<br />17 long result = 0;<br />18 for(i=1; i&lt;=100; i++)<br />19 {<br />20 result += i;<br />21 }<br />22<br />23 printf("result[1-100] = %d \n", result );<br />24 printf("result[1-250] = %d \n", func(250) );<br />25 }</p>
												<p>编译生成执行文件：（Linux下）<br />hchen/test&gt; cc -g tst.c -o tst</p>
												<p>使用GDB调试：</p>
												<p>hchen/test&gt; gdb tst &lt;---------- 启动GDB<br />GNU gdb 5.1.1<br />Copyright 2002 Free Software Foundation, Inc.<br />GDB is free software, covered by the GNU General Public License, and you are<br />welcome to change it and/or distribute copies of it under certain conditions.<br />Type "show copying" to see the conditions.<br />There is absolutely no warranty for GDB. Type "show warranty" for details.<br />This GDB was configured as "i386-suse-linux"...<br />(gdb) l &lt;-------------------- l命令相当于list，从第一行开始例出原码。<br />1 #include <stdio.h></stdio.h><br />2<br />3 int func(int n)<br />4 {<br />5 int sum=0,i;<br />6 for(i=0; i<n></n><br />7 {<br />8 sum+=i;<br />9 }<br />10 return sum;<br />(gdb) &lt;-------------------- 直接回车表示，重复上一次命令<br />11 }<br />12<br />13<br />14 main()<br />15 {<br />16 int i;<br />17 long result = 0;<br />18 for(i=1; i&lt;=100; i++)<br />19 {<br />20 result += i; <br />(gdb) break 16 &lt;-------------------- 设置断点，在源程序第16行处。<br />Breakpoint 1 at 0x8048496: file tst.c, line 16.<br />(gdb) break func &lt;-------------------- 设置断点，在函数func()入口处。<br />Breakpoint 2 at 0x8048456: file tst.c, line 5.<br />(gdb) info break &lt;-------------------- 查看断点信息。<br />Num Type Disp Enb Address What<br />1 breakpoint keep y 0x08048496 in main at tst.c:16<br />2 breakpoint keep y 0x08048456 in func at tst.c:5<br />(gdb) r &lt;--------------------- 运行程序，run命令简写<br />Starting program: /home/hchen/test/tst</p>
												<p>Breakpoint 1, main () at tst.c:17 &lt;---------- 在断点处停住。<br />17 long result = 0;<br />(gdb) n &lt;--------------------- 单条语句执行，next命令简写。<br />18 for(i=1; i&lt;=100; i++)<br />(gdb) n<br />20 result += i;<br />(gdb) n<br />18 for(i=1; i&lt;=100; i++)<br />(gdb) n<br />20 result += i;<br />(gdb) c &lt;--------------------- 继续运行程序，continue命令简写。<br />Continuing.<br />result[1-100] = 5050 &lt;----------程序输出。</p>
												<p>Breakpoint 2, func (n=250) at tst.c:5<br />5 int sum=0,i;<br />(gdb) n<br />6 for(i=1; i&lt;=n; i++)<br />(gdb) p i &lt;--------------------- 打印变量i的值，print命令简写。<br />$1 = 134513808<br />(gdb) n<br />8 sum+=i;<br />(gdb) n<br />6 for(i=1; i&lt;=n; i++)<br />(gdb) p sum<br />$2 = 1<br />(gdb) n<br />8 sum+=i;<br />(gdb) p i<br />$3 = 2<br />(gdb) n<br />6 for(i=1; i&lt;=n; i++)<br />(gdb) p sum<br />$4 = 3<br />(gdb) bt &lt;--------------------- 查看函数堆栈。<br />#0 func (n=250) at tst.c:5<br />#1 0x080484e4 in main () at tst.c:24<br />#2 0x400409ed in __libc_start_main () from /lib/libc.so.6<br />(gdb) finish &lt;--------------------- 退出函数。<br />Run till exit from #0 func (n=250) at tst.c:5<br />0x080484e4 in main () at tst.c:24<br />24 printf("result[1-250] = %d \n", func(250) );<br />Value returned is $6 = 31375<br />(gdb) c &lt;--------------------- 继续运行。<br />Continuing.<br />result[1-250] = 31375 &lt;----------程序输出。</p>
												<p>Program exited with code 027. &lt;--------程序退出，调试结束。<br />(gdb) q &lt;--------------------- 退出gdb。<br />hchen/test&gt;</p>
												<p>好了，有了以上的感性认识，还是让我们来系统地认识一下gdb吧。</p>
												<p>使用GDB<br />————</p>
												<p>一般来说GDB主要调试的是C/C++的程序。要调试C/C++的程序，首先在编译时，我们必须要把调试信息加到可执行文件中。使用编译器（cc/gcc/g++）的 -g 参数可以做到这一点。如：</p>
												<p>&gt; cc -g hello.c -o hello<br />&gt; g++ -g hello.cpp -o hello</p>
												<p>如果没有-g，你将看不见程序的函数名、变量名，所代替的全是运行时的内存地址。当你用-g把调试信息加入之后，并成功编译目标代码以后，让我们来看看如何用gdb来调试他。</p>
												<p>启动GDB的方法有以下几种：</p>
												<p>1、gdb <program></program><br />program也就是你的执行文件，一般在当然目录下。</p>
												<p>2、gdb <program></program>core<br />用gdb同时调试一个运行程序和core文件，core是程序非法执行后core dump后产生的文件。</p>
												<p>3、gdb <program></program><pid></pid><br />如果你的程序是一个服务程序，那么你可以指定这个服务程序运行时的进程ID。gdb会自动attach上去，并调试他。program应该在PATH环境变量中搜索得到。</p>
												<p>
												</p>
												<p>GDB启动时，可以加上一些GDB的启动开关，详细的开关可以用gdb -help查看。我在下面只例举一些比较常用的参数：</p>
												<p>-symbols <file></file><br />-s <file></file><br />从指定文件中读取符号表。</p>
												<p>-se file <br />从指定文件中读取符号表信息，并把他用在可执行文件中。</p>
												<p>-core <file></file><br />-c <file></file><br />调试时core dump的core文件。</p>
												<p>-directory <directory></directory><br />-d <directory></directory><br />加入一个源文件的搜索路径。默认搜索路径是环境变量中PATH所定义的路径。</p>
												<p>GDB的命令概貌<br />———————</p>
												<p>启动gdb后，就你被带入gdb的调试环境中，就可以使用gdb的命令开始调试程序了，gdb的命令可以使用help命令来查看，如下所示：</p>
												<p>/home/hchen&gt; gdb<br />GNU gdb 5.1.1<br />Copyright 2002 Free Software Foundation, Inc.<br />GDB is free software, covered by the GNU General Public License, and you are<br />welcome to change it and/or distribute copies of it under certain conditions.<br />Type "show copying" to see the conditions.<br />There is absolutely no warranty for GDB. Type "show warranty" for details.<br />This GDB was configured as "i386-suse-linux".<br />(gdb) help<br />List of classes of commands:</p>
												<p>aliases -- Aliases of other commands<br />breakpoints -- Making program stop at certain points<br />data -- Examining data<br />files -- Specifying and examining files<br />internals -- Maintenance commands<br />obscure -- Obscure features<br />running -- Running the program<br />stack -- Examining the stack<br />status -- Status inquiries<br />support -- Support facilities<br />tracepoints -- Tracing of program execution without stopping the program<br />user-defined -- User-defined commands</p>
												<p>Type "help" followed by a class name for a list of commands in that class.<br />Type "help" followed by command name for full documentation.<br />Command name abbreviations are allowed if unambiguous.<br />(gdb)</p>
												<p>gdb的命令很多，gdb把之分成许多个种类。help命令只是例出gdb的命令种类，如果要看种类中的命令，可以使用help <class></class>命令，如：help breakpoints，查看设置断点的所有命令。也可以直接help <command></command>来查看命令的帮助。</p>
												<p>
														<br />gdb中，输入命令时，可以不用打全命令，只用打命令的前几个字符就可以了，当然，命令的前几个字符应该要标志着一个唯一的命令，在Linux下，你可以敲击两次TAB键来补齐命令的全称，如果有重复的，那么gdb会把其例出来。<br /><br />示例一：在进入函数func时，设置一个断点。可以敲入break func，或是直接就是b func<br />(gdb) b func<br />Breakpoint 1 at 0x8048458: file hello.c, line 10.<br /><br />示例二：敲入b按两次TAB键，你会看到所有b打头的命令：<br />(gdb) b<br />backtrace break bt<br />(gdb)</p>
												<p>示例三：只记得函数的前缀，可以这样：<br />(gdb) b make_ &lt;按TAB键&gt;<br />（再按下一次TAB键，你会看到:）<br />make_a_section_from_file make_environ<br />make_abs_section make_function_type<br />make_blockvector make_pointer_type<br />make_cleanup make_reference_type<br />make_command make_symbol_completion_list<br />(gdb) b make_<br />GDB把所有make开头的函数全部例出来给你查看。</p>
												<p>示例四：调试C++的程序时，有可以函数名一样。如：<br />(gdb) b 'bubble( M-? <br />bubble(double,double) bubble(int,int)<br />(gdb) b 'bubble(<br />你可以查看到C++中的所有的重载函数及参数。（注：M-?和“按两次TAB键”是一个意思）</p>
												<p>要退出gdb时，只用发quit或命令简称q就行了。</p>
												<p>GDB中运行UNIX的shell程序<br />————————————</p>
												<p>在gdb环境中，你可以执行UNIX的shell的命令，使用gdb的shell命令来完成：</p>
												<p>shell <command></command><br />调用UNIX的shell来执行<command></command>，环境变量SHELL中定义的UNIX的shell将会被用来执行<command></command>，如果SHELL没有定义，那就使用UNIX的标准shell：/bin/sh。（在Windows中使用Command.com或cmd.exe）</p>
												<p>还有一个gdb命令是make：<br />make <make-args></make-args><br />可以在gdb中执行make命令来重新build自己的程序。这个命令等价于“shell make <make-args></make-args>”。 </p>
												<p>在GDB中运行程序<br />————————</p>
												<p>当以gdb <program></program>方式启动gdb后，gdb会在PATH路径和当前目录中搜索 <program></program>的源文件。如要确认gdb是否读到源文件，可使用l或list命令，看看gdb是否能列出源代码。</p>
												<p>在gdb中，运行程序使用r或是run命令。程序的运行，你有可能需要设置下面四方面的事。</p>
												<p>1、程序运行参数。<br />set args 可指定运行时参数。（如：set args 10 20 30 40 50）<br />show args 命令可以查看设置好的运行参数。</p>
												<p>2、运行环境。<br />path </p>
												<dir>可设定程序的运行路径。<br />show paths 查看程序的运行路径。<br />set environment varname [=value] 设置环境变量。如：set env USER=hchen<br />show environment [varname] 查看环境变量。 
<p>3、工作目录。<br />cd </p><dir>相当于shell的cd命令。<br />pwd 显示当前的所在目录。 
<p>4、程序的输入输出。<br />info terminal 显示你程序用到的终端的模式。<br />使用重定向控制程序输出。如：run &gt; outfile<br />tty命令可以指写输入输出的终端设备。如：tty /dev/ttyb</p><p><br />调试已运行的程序<br />————————</p><p>两种方法：<br />1、在UNIX下用ps查看正在运行的程序的PID（进程ID），然后用gdb <program></program>PID格式挂接正在运行的程序。<br />2、先用gdb <program></program>关联上源代码，并进行gdb，在gdb中用attach命令来挂接进程的PID。并用detach来取消挂接的进程。</p><p>暂停 / 恢复程序运行<br />—————————</p><p>调试程序中，暂停程序运行是必须的，GDB可以方便地暂停程序的运行。你可以设置程序的在哪行停住，在什么条件下停住，在收到什么信号时停往等等。以便于你查看运行时的变量，以及运行时的流程。</p><p>当进程被gdb停住时，你可以使用info program 来查看程序的是否在运行，进程号，被暂停的原因。</p><p>在gdb中，我们可以有以下几种暂停方式：断点（BreakPoint）、观察点（WatchPoint）、捕捉点（CatchPoint）、信号（Signals）、线程停止（Thread Stops）。如果要恢复程序运行，可以使用c或是continue命令。</p><p>一、设置断点（BreakPoint）<br /><br />我们用break命令来设置断点。正面有几点设置断点的方法：<br /><br />break <function></function><br />在进入指定函数时停住。C++中可以使用class::function或function(type,type)格式来指定函数名。</p><p>break <linenum></linenum><br />在指定行号停住。</p><p>break +offset <br />break -offset <br />在当前行号的前面或后面的offset行停住。offiset为自然数。</p><p>break filename:linenum <br />在源文件filename的linenum行处停住。</p><p>break filename:function <br />在源文件filename的function函数的入口处停住。</p><p>break *address<br />在程序运行的内存地址处停住。</p><p>break <br />break命令没有参数时，表示在下一条指令处停住。</p><p>break ... if <condition></condition><br />...可以是上述的参数，condition表示条件，在条件成立时停住。比如在循环境体中，可以设置break if i=100，表示当i为100时停住程序。</p><p>查看断点时，可使用info命令，如下所示：（注：n表示断点号）<br />info breakpoints [n] <br />info break [n] </p><p><br />二、设置观察点（WatchPoint）<br /><br />观察点一般来观察某个表达式（变量也是一种表达式）的值是否有变化了，如果有变化，马上停住程序。我们有下面的几种方法来设置观察点：<br /><br />watch <expr></expr><br />为表达式（变量）expr设置一个观察点。一量表达式值有变化时，马上停住程序。<br /><br />rwatch <expr></expr><br />当表达式（变量）expr被读时，停住程序。<br /><br />awatch <expr></expr><br />当表达式（变量）的值被读或被写时，停住程序。<br /><br />info watchpoints<br />列出当前所设置了的所有观察点。</p><p>三、设置捕捉点（CatchPoint）</p><p>你可设置捕捉点来补捉程序运行时的一些事件。如：载入共享库（动态链接库）或是C++的异常。设置捕捉点的格式为：<br /><br />catch <event><br />当event发生时，停住程序。event可以是下面的内容：<br />1、throw 一个C++抛出的异常。（throw为关键字）<br />2、catch 一个C++捕捉到的异常。（catch为关键字）<br />3、exec 调用系统调用exec时。（exec为关键字，目前此功能只在HP-UX下有用）<br />4、fork 调用系统调用fork时。（fork为关键字，目前此功能只在HP-UX下有用）<br />5、vfork 调用系统调用vfork时。（vfork为关键字，目前此功能只在HP-UX下有用）<br />6、load 或 load <libname></libname>载入共享库（动态链接库）时。（load为关键字，目前此功能只在HP-UX下有用）<br />7、unload 或 unload <libname></libname>卸载共享库（动态链接库）时。（unload为关键字，目前此功能只在HP-UX下有用）</event></p><p>tcatch <event><br />只设置一次捕捉点，当程序停住以后，应点被自动删除。</event></p><p>四、维护停止点</p><p>上面说了如何设置程序的停止点，GDB中的停止点也就是上述的三类。在GDB中，如果你觉得已定义好的停止点没有用了，你可以使用delete、clear、disable、enable这几个命令来进行维护。</p><p>clear<br />清除所有的已定义的停止点。</p><p>clear <function></function><br />clear <?XML:NAMESPACE PREFIX = FILENAME /?><filename:function><br />清除所有设置在函数上的停止点。</filename:function></p><p>clear <linenum></linenum><br />clear <filename:linenum><br />清除所有设置在指定行上的停止点。</filename:linenum></p><p>delete [breakpoints] [range...]<br />删除指定的断点，breakpoints为断点号。如果不指定断点号，则表示删除所有的断点。range 表示断点号的范围（如：3-7）。其简写命令为d。</p><p>比删除更好的一种方法是disable停止点，disable了的停止点，GDB不会删除，当你还需要时，enable即可，就好像回收站一样。</p><p>disable [breakpoints] [range...]<br />disable所指定的停止点，breakpoints为停止点号。如果什么都不指定，表示disable所有的停止点。简写命令是dis.</p><p>enable [breakpoints] [range...]<br />enable所指定的停止点，breakpoints为停止点号。</p><p>enable [breakpoints] once range...<br />enable所指定的停止点一次，当程序停止后，该停止点马上被GDB自动disable。</p><p>enable [breakpoints] delete range...<br />enable所指定的停止点一次，当程序停止后，该停止点马上被GDB自动删除。</p><p>五、停止条件维护</p><p>前面在说到设置断点时，我们提到过可以设置一个条件，当条件成立时，程序自动停止，这是一个非常强大的功能，这里，我想专门说说这个条件的相关维护命令。一般来说，为断点设置一个条件，我们使用if关键词，后面跟其断点条件。并且，条件设置好后，我们可以用condition命令来修改断点的条件。（只有break和watch命令支持if，catch目前暂不支持if）</p><p>condition <bnum></bnum><expression></expression><br />修改断点号为bnum的停止条件为expression。</p><p>condition <bnum></bnum><br />清除断点号为bnum的停止条件。</p><p><br />还有一个比较特殊的维护命令ignore，你可以指定程序运行时，忽略停止条件几次。</p><p>ignore <bnum></bnum><count></count><br />表示忽略断点号为bnum的停止条件count次。</p><p>六、为停止点设定运行命令</p><p>我们可以使用GDB提供的command命令来设置停止点的运行命令。也就是说，当运行的程序在被停止住时，我们可以让其自动运行一些别的命令，这很有利行自动化调试。对基于GDB的自动化调试是一个强大的支持。</p><p><br />commands [bnum]<br />... command-list ...<br />end</p><p>为断点号bnum指写一个命令列表。当程序被该断点停住时，gdb会依次运行命令列表中的命令。</p><p>例如：</p><p>break foo if x&gt;0<br />commands<br />printf "x is %d\n",x<br />continue<br />end<br />断点设置在函数foo中，断点条件是x&gt;0，如果程序被断住后，也就是，一旦x的值在foo函数中大于0，GDB会自动打印出x的值，并继续运行程序。</p><p>如果你要清除断点上的命令序列，那么只要简单的执行一下commands命令，并直接在打个end就行了。</p><p>七、断点菜单</p><p>在C++中，可能会重复出现同一个名字的函数若干次（函数重载），在这种情况下，break <function></function>不能告诉GDB要停在哪个函数的入口。当然，你可以使用break <function></function>也就是把函数的参数类型告诉GDB，以指定一个函数。否则的话，GDB会给你列出一个断点菜单供你选择你所需要的断点。你只要输入你菜单列表中的编号就可以了。如：</p><p>(gdb) b String::after<br />[0] cancel<br />[1] all<br />[2] file:String.cc; line number:867<br />[3] file:String.cc; line number:860<br />[4] file:String.cc; line number:875<br />[5] file:String.cc; line number:853<br />[6] file:String.cc; line number:846<br />[7] file:String.cc; line number:735<br />&gt; 2 4 6<br />Breakpoint 1 at 0xb26c: file String.cc, line 867.<br />Breakpoint 2 at 0xb344: file String.cc, line 875.<br />Breakpoint 3 at 0xafcc: file String.cc, line 846.<br />Multiple breakpoints were set.<br />Use the "delete" command to delete unwanted<br />breakpoints.<br />(gdb)</p><p>可见，GDB列出了所有after的重载函数，你可以选一下列表编号就行了。0表示放弃设置断点，1表示所有函数都设置断点。</p><p>八、恢复程序运行和单步调试</p><p>当程序被停住了，你可以用continue命令恢复程序的运行直到程序结束，或下一个断点到来。也可以使用step或next命令单步跟踪程序。</p><p>continue [ignore-count]<br />c [ignore-count]<br />fg [ignore-count]<br />恢复程序运行，直到程序结束，或是下一个断点到来。ignore-count表示忽略其后的断点次数。continue，c，fg三个命令都是一样的意思。</p><p><br />step <count></count><br />单步跟踪，如果有函数调用，他会进入该函数。进入函数的前提是，此函数被编译有debug信息。很像VC等工具中的step in。后面可以加count也可以不加，不加表示一条条地执行，加表示执行后面的count条指令，然后再停住。</p><p>next <count></count><br />同样单步跟踪，如果有函数调用，他不会进入该函数。很像VC等工具中的step over。后面可以加count也可以不加，不加表示一条条地执行，加表示执行后面的count条指令，然后再停住。</p><p>set step-mode<br />set step-mode on<br />打开step-mode模式，于是，在进行单步跟踪时，程序不会因为没有debug信息而不停住。这个参数有很利于查看机器码。</p><p>set step-mod off<br />关闭step-mode模式。</p><p>finish<br />运行程序，直到当前函数完成返回。并打印函数返回时的堆栈地址和返回值及参数值等信息。</p><p>until 或 u<br />当你厌倦了在一个循环体内单步跟踪时，这个命令可以运行程序直到退出循环体。</p><p>stepi 或 si<br />nexti 或 ni<br />单步跟踪一条机器指令！一条程序代码有可能由数条机器指令完成，stepi和nexti可以单步执行机器指令。与之一样有相同功能的命令是 “display/i $pc” ，当运行完这个命令后，单步跟踪会在打出程序代码的同时打出机器指令（也就是汇编代码）</p><p>九、信号（Signals）</p><p>信号是一种软中断，是一种处理异步事件的方法。一般来说，操作系统都支持许多信号。尤其是UNIX，比较重要应用程序一般都会处理信号。UNIX定义了许多信号，比如SIGINT表示中断字符信号，也就是Ctrl+C的信号，SIGBUS表示硬件故障的信号；SIGCHLD表示子进程状态改变信号； SIGKILL表示终止程序运行的信号，等等。信号量编程是UNIX下非常重要的一种技术。</p><p>GDB有能力在你调试程序的时候处理任何一种信号，你可以告诉GDB需要处理哪一种信号。你可以要求GDB收到你所指定的信号时，马上停住正在运行的程序，以供你进行调试。你可以用GDB的handle命令来完成这一功能。</p><p>handle <signal></signal><br />在GDB中定义一个信号处理。信号<signal></signal>可以以SIG开头或不以SIG开头，可以用定义一个要处理信号的范围（如：SIGIO-SIGKILL，表示处理从SIGIO信号到SIGKILL的信号，其中包括SIGIO，SIGIOT，SIGKILL三个信号），也可以使用关键字all来标明要处理所有的信号。一旦被调试的程序接收到信号，运行程序马上会被GDB停住，以供调试。其<keywords></keywords>可以是以下几种关键字的一个或多个。</p><p>nostop<br />当被调试的程序收到信号时，GDB不会停住程序的运行，但会打出消息告诉你收到这种信号。<br />stop<br />当被调试的程序收到信号时，GDB会停住你的程序。<br />print<br />当被调试的程序收到信号时，GDB会显示出一条信息。<br />noprint<br />当被调试的程序收到信号时，GDB不会告诉你收到信号的信息。<br />pass<br />noignore<br />当被调试的程序收到信号时，GDB不处理信号。这表示，GDB会把这个信号交给被调试程序会处理。<br />nopass<br />ignore<br />当被调试的程序收到信号时，GDB不会让被调试程序来处理这个信号。</p><p><br />info signals<br />info handle<br />查看有哪些信号在被GDB检测中。</p><p>十、线程（Thread Stops）</p><p>如果你程序是多线程的话，你可以定义你的断点是否在所有的线程上，或是在某个特定的线程。GDB很容易帮你完成这一工作。</p><p>break <linespec></linespec>thread <threadno></threadno><br />break <linespec></linespec>thread <threadno></threadno>if ...<br />linespec指定了断点设置在的源程序的行号。threadno指定了线程的ID，注意，这个ID是GDB分配的，你可以通过“info threads”命令来查看正在运行程序中的线程信息。如果你不指定thread <threadno></threadno>则表示你的断点设在所有线程上面。你还可以为某线程指定断点条件。如：<br /><br />(gdb) break frik.c:13 thread 28 if bartab &gt; lim</p><p>当你的程序被GDB停住时，所有的运行线程都会被停住。这方便你你查看运行程序的总体情况。而在你恢复程序运行时，所有的线程也会被恢复运行。那怕是主进程在被单步调试时。</p><p>查看栈信息<br />—————</p><p>当程序被停住了，你需要做的第一件事就是查看程序是在哪里停住的。当你的程序调用了一个函数，函数的地址，函数参数，函数内的局部变量都会被压入“栈”（Stack）中。你可以用GDB命令来查看当前的栈中的信息。</p><p>下面是一些查看函数调用栈信息的GDB命令：</p><p>backtrace <br />bt <br />打印当前的函数调用栈的所有信息。如：<br /><br />(gdb) bt<br />#0 func (n=250) at tst.c:6<br />#1 0x08048524 in main (argc=1, argv=0xbffff674) at tst.c:30<br />#2 0x400409ed in __libc_start_main () from /lib/libc.so.6<br /><br />从上可以看出函数的调用栈信息：__libc_start_main --&gt; main() --&gt; func()<br /><br /><br />backtrace <n></n><br />bt <n></n><br />n是一个正整数，表示只打印栈顶上n层的栈信息。</p><p>backtrace &lt;-n&gt; <br />bt &lt;-n&gt; <br />-n表一个负整数，表示只打印栈底下n层的栈信息。<br /><br />如果你要查看某一层的信息，你需要在切换当前的栈，一般来说，程序停止时，最顶层的栈就是当前栈，如果你要查看栈下面层的详细信息，首先要做的是切换当前栈。</p><p>frame <n></n><br />f <n></n><br />n是一个从0开始的整数，是栈中的层编号。比如：frame 0，表示栈顶，frame 1，表示栈的第二层。<br /><br />up <n></n><br />表示向栈的上面移动n层，可以不打n，表示向上移动一层。 <br /><br />down <n></n><br />表示向栈的下面移动n层，可以不打n，表示向下移动一层。 <br /></p><p>上面的命令，都会打印出移动到的栈层的信息。如果你不想让其打出信息。你可以使用这三个命令：<br /><br />select-frame <n></n>对应于 frame 命令。<br />up-silently <n></n>对应于 up 命令。<br />down-silently <n></n>对应于 down 命令。</p><p><br />查看当前栈层的信息，你可以用以下GDB命令：</p><p>frame 或 f <br />会打印出这些信息：栈的层编号，当前的函数名，函数参数值，函数所在文件及行号，函数执行到的语句。<br /><br />info frame <br />info f <br />这个命令会打印出更为详细的当前栈层的信息，只不过，大多数都是运行时的内内地址。比如：函数地址，调用函数的地址，被调用函数的地址，目前的函数是由什么样的程序语言写成的、函数参数地址及值、局部变量的地址等等。如：<br />(gdb) info f<br />Stack level 0, frame at 0xbffff5d4:<br />eip = 0x804845d in func (tst.c:6); saved eip 0x8048524<br />called by frame at 0xbffff60c<br />source language c.<br />Arglist at 0xbffff5d4, args: n=250<br />Locals at 0xbffff5d4, Previous frame's sp is 0x0<br />Saved registers:<br />ebp at 0xbffff5d4, eip at 0xbffff5d8<br /><br />info args<br />打印出当前函数的参数名及其值。<br /><br />info locals<br />打印出当前函数中所有局部变量及其值。<br /><br />info catch<br />打印出当前的函数中的异常处理信息。</p></dir></dir>
										</div>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/lantin/aggbug/180457.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lantin/" target="_blank">花之剑</a> 2008-02-18 14:02 <a href="http://www.blogjava.net/lantin/articles/180457.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于宏的理解(转)</title><link>http://www.blogjava.net/lantin/articles/178351.html</link><dc:creator>花之剑</dc:creator><author>花之剑</author><pubDate>Tue, 29 Jan 2008 05:35:00 GMT</pubDate><guid>http://www.blogjava.net/lantin/articles/178351.html</guid><wfw:comment>http://www.blogjava.net/lantin/comments/178351.html</wfw:comment><comments>http://www.blogjava.net/lantin/articles/178351.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lantin/comments/commentRss/178351.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lantin/services/trackbacks/178351.html</trackback:ping><description><![CDATA[
		<p>C语言宏定义技巧（常用宏定义）  <br />  <br />写好C语言，漂亮的宏定义很重要，使用宏定义可以防止出错，提高可移植性，可读性，方便性 等等。下面列举一些成熟软件中常用得宏定义。。。。。。 </p>
		<p>
		</p>
		<p>1，防止一个头文件被重复包含 </p>
		<p>#ifndef COMDEF_H </p>
		<p>#define COMDEF_H </p>
		<p>  //头文件内容 </p>
		<p>#endif </p>
		<p>2，重新定义一些类型，防止由于各种平台和编译器的不同，而产生的类型字节数差异，方便移植。 </p>
		<p>typedef  unsigned char      boolean;     /* Boolean value type. */ </p>
		<p>
		</p>
		<p>typedef  unsigned long int  uint32;      /* Unsigned 32 bit value */ </p>
		<p>typedef  unsigned short     uint16;      /* Unsigned 16 bit value */ </p>
		<p>typedef  unsigned char      uint8;       /* Unsigned 8  bit value */ </p>
		<p>
		</p>
		<p>typedef  signed long int    int32;       /* Signed 32 bit value */ </p>
		<p>typedef  signed short       int16;       /* Signed 16 bit value */ </p>
		<p>typedef  signed char        int8;        /* Signed 8  bit value */ </p>
		<p>
		</p>
		<p>
		</p>
		<p>//下面的不建议使用 </p>
		<p>typedef  unsigned char     byte;         /* Unsigned 8  bit value type. */ </p>
		<p>typedef  unsigned short    word;         /* Unsinged 16 bit value type. */ </p>
		<p>typedef  unsigned long     dword;        /* Unsigned 32 bit value type. */ </p>
		<p>
		</p>
		<p>typedef  unsigned char     uint1;        /* Unsigned 8  bit value type. */ </p>
		<p>typedef  unsigned short    uint2;        /* Unsigned 16 bit value type. */ </p>
		<p>typedef  unsigned long     uint4;        /* Unsigned 32 bit value type. */ </p>
		<p>
		</p>
		<p>typedef  signed char       int1;         /* Signed 8  bit value type. */ </p>
		<p>typedef  signed short      int2;         /* Signed 16 bit value type. */ </p>
		<p>typedef  long int          int4;         /* Signed 32 bit value type. */ </p>
		<p>
		</p>
		<p>typedef  signed long       sint31;       /* Signed 32 bit value */ </p>
		<p>typedef  signed short      sint15;       /* Signed 16 bit value */ </p>
		<p>typedef  signed char       sint7;        /* Signed 8  bit value */ </p>
		<p>
		</p>
		<p>3，得到指定地址上的一个字节或字 </p>
		<p>#define  MEM_B( x )  ( *( (byte *) (x) ) ) </p>
		<p>#define  MEM_W( x )  ( *( (word *) (x) ) ) </p>
		<p>4，求最大值和最小值 </p>
		<p>   #define  MAX( x, y ) ( ((x) &gt; (y)) ? (x) : (y) ) </p>
		<p>   #define  MIN( x, y ) ( ((x) &lt; (y)) ? (x) : (y) ) </p>
		<p>5，得到一个field在结构体(struct)中的偏移量 </p>
		<p>#define FPOS( type, field ) \ </p>
		<p>/*lint -e545 */ ( (dword) &amp;(( type *) 0)-&gt; field ) /*lint +e545 */ </p>
		<p>6,得到一个结构体中field所占用的字节数 </p>
		<p>#define FSIZ( type, field ) sizeof( ((type *) 0)-&gt;field ) </p>
		<p>7，按照LSB格式把两个字节转化为一个Word </p>
		<p>#define  FLIPW( ray ) ( (((word) (ray)[0]) * 256) + (ray)[1] ) </p>
		<p>8，按照LSB格式把一个Word转化为两个字节 </p>
		<p>#define  FLOPW( ray, val ) \ </p>
		<p>  (ray)[0] = ((val) / 256); \ </p>
		<p>  (ray)[1] = ((val) &amp; 0xFF) </p>
		<p>9，得到一个变量的地址（word宽度） </p>
		<p>#define  B_PTR( var )  ( (byte *) (void *) &amp;(var) ) </p>
		<p>#define  W_PTR( var )  ( (word *) (void *) &amp;(var) ) </p>
		<p>10，得到一个字的高位和低位字节 </p>
		<p>#define  WORD_LO(xxx)  ((byte) ((word)(xxx) &amp; 255)) </p>
		<p>#define  WORD_HI(xxx)  ((byte) ((word)(xxx) &gt;&gt; 8)) </p>
		<p>11，返回一个比X大的最接近的8的倍数 </p>
		<p>#define RND8( x )       ((((x) + 7) / 8 ) * 8 ) </p>
		<p>12，将一个字母转换为大写 </p>
		<p>#define  UPCASE( c ) ( ((c) &gt;= 'a' &amp;&amp; (c) &lt;= 'z') ? ((c) - 0x20) : (c) ) </p>
		<p>13，判断字符是不是10进值的数字 </p>
		<p>#define  DECCHK( c ) ((c) &gt;= '0' &amp;&amp; (c) &lt;= '9') </p>
		<p>14，判断字符是不是16进值的数字 </p>
		<p>#define  HEXCHK( c ) ( ((c) &gt;= '0' &amp;&amp; (c) &lt;= '9') ||\ </p>
		<p>                       ((c) &gt;= 'A' &amp;&amp; (c) &lt;= 'F') ||\ </p>
		<p>((c) &gt;= 'a' &amp;&amp; (c) &lt;= 'f') ) </p>
		<p>15，防止溢出的一个方法 </p>
		<p>#define  INC_SAT( val )  (val = ((val)+1 &gt; (val)) ? (val)+1 : (val)) </p>
		<p>16，返回数组元素的个数 </p>
		<p>#define  ARR_SIZE( a )  ( sizeof( (a) ) / sizeof( (a[0]) ) ) </p>
		<p>17，返回一个无符号数n尾的值MOD_BY_POWER_OF_TWO(X,n)=X%(2^n) </p>
		<p>#define MOD_BY_POWER_OF_TWO( val, mod_by ) \ </p>
		<p>           ( (dword)(val) &amp; (dword)((mod_by)-1) ) </p>
		<p>18，对于IO空间映射在存储空间的结构，输入输出处理 </p>
		<p>  #define inp(port)         (*((volatile byte *) (port))) </p>
		<p>  #define inpw(port)        (*((volatile word *) (port))) </p>
		<p>  #define inpdw(port)       (*((volatile dword *)(port))) </p>
		<p>   </p>
		<p>  #define outp(port, val)   (*((volatile byte *) (port)) = ((byte) (val))) </p>
		<p>  #define outpw(port, val)  (*((volatile word *) (port)) = ((word) (val))) </p>
		<p>  #define outpdw(port, val) (*((volatile dword *) (port)) = ((dword) (val))) </p>
		<p>[2005-9-9添加]  </p>
		<p>19,使用一些宏跟踪调试 </p>
		<p>A N S I标准说明了五个预定义的宏名。它们是： </p>
		<p>_ L I N E _ </p>
		<p>_ F I L E _ </p>
		<p>_ D A T E _ </p>
		<p>_ T I M E _ </p>
		<p>_ S T D C _ </p>
		<p>如果编译不是标准的，则可能仅支持以上宏名中的几个，或根本不支持。记住编译程序 </p>
		<p>也许还提供其它预定义的宏名。 </p>
		<p>_ L I N E _及_ F I L E _宏指令在有关# l i n e的部分中已讨论，这里讨论其余的宏名。 </p>
		<p>_ D AT E _宏指令含有形式为月/日/年的串，表示源文件被翻译到代码时的日期。 </p>
		<p>源代码翻译到目标代码的时间作为串包含在_ T I M E _中。串形式为时：分：秒。 </p>
		<p>如果实现是标准的，则宏_ S T D C _含有十进制常量1。如果它含有任何其它数，则实现是 </p>
		<p>非标准的。 </p>
		<p>可以定义宏，例如: </p>
		<p>当定义了_DEBUG，输出数据信息和所在文件所在行 </p>
		<p>#ifdef _DEBUG </p>
		<p>#define DEBUGMSG(msg,date) printf(msg);printf(“%d%d%d”,date,_LINE_,_FILE_) </p>
		<p>#else </p>
		<p>      #define DEBUGMSG(msg,date)  </p>
		<p>#endif </p>
		<p>
		</p>
		<p>20，宏定义防止使用是错误 </p>
		<p>用小括号包含。 </p>
		<p>例如：#define ADD(a,b) （a+b） </p>
		<p>用do{}while(0)语句包含多语句防止错误 </p>
		<p>例如：#difne DO(a,b) a+b;\ </p>
		<p>                   a++; </p>
		<p>应用时：if(….) </p>
		<p>          DO(a,b); //产生错误 </p>
		<p>        else </p>
		<p>         </p>
		<p>解决方法: #difne DO(a,b) do{a+b;\ </p>
		<p>                   a++;}while(0) </p>
		<p> </p>
		<p>
				<br />　宏中"#"和"##"的用法 <br />一、一般用法 <br />我们使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起. <br />用法: <br />#include&lt;cstdio&gt; <br />#include&lt;climits&gt; <br />using namespace std; </p>
		<p>#define STR(s)     #s <br />#define CONS(a,b)  int(a##e##b) </p>
		<p>int main() <br />{ <br />    printf(STR(vck));           // 输出字符串"vck" <br />    printf("%d\n", CONS(2,3));  // 2e3 输出:2000 <br />    return 0; <br />} </p>
		<p>二、当宏参数是另一个宏的时候 <br />需要注意的是凡宏定义里有用'#'或'##'的地方宏参数是不会再展开. </p>
		<p>1, 非'#'和'##'的情况 <br />#define TOW      (2) <br />#define MUL(a,b) (a*b) </p>
		<p>printf("%d*%d=%d\n", TOW, TOW, MUL(TOW,TOW)); <br />这行的宏会被展开为： <br />printf("%d*%d=%d\n", (2), (2), ((2)*(2))); <br />MUL里的参数TOW会被展开为(2). </p>
		<p>2, 当有'#'或'##'的时候 <br />#define A          (2) <br />#define STR(s)     #s <br />#define CONS(a,b)  int(a##e##b) </p>
		<p>printf("int max: %s\n",  STR(INT_MAX));    // INT_MAX #include&lt;climits&gt; <br />这行会被展开为： <br />printf("int max: %s\n", "INT_MAX"); </p>
		<p>printf("%s\n", CONS(A, A));               // compile error  <br />这一行则是： <br />printf("%s\n", int(AeA)); </p>
		<p>INT_MAX和A都不会再被展开, 然而解决这个问题的方法很简单. 加多一层中间转换宏. <br />加这层宏的用意是把所有宏的参数在这层里全部展开, 那么在转换宏里的那一个宏(_STR)就能得到正确的宏参数. </p>
		<p>#define A           (2) <br />#define _STR(s)     #s <br />#define STR(s)      _STR(s)          // 转换宏 <br />#define _CONS(a,b)  int(a##e##b) <br />#define CONS(a,b)   _CONS(a,b)       // 转换宏 </p>
		<p>printf("int max: %s\n", STR(INT_MAX));          // INT_MAX,int型的最大值，为一个变量 #include&lt;climits&gt; <br />输出为: int max: 0x7fffffff <br />STR(INT_MAX) --&gt;  _STR(0x7fffffff) 然后再转换成字符串； </p>
		<p>printf("%d\n", CONS(A, A)); <br />输出为：200 <br />CONS(A, A)  --&gt;  _CONS((2), (2))  --&gt; int((2)e(2)) </p>
		<p>三、'#'和'##'的一些应用特例 <br />1、合并匿名变量名 <br />#define  ___ANONYMOUS1(type, var, line)  type  var##line <br />#define  __ANONYMOUS0(type, line)  ___ANONYMOUS1(type, _anonymous, line) <br />#define  ANONYMOUS(type)  __ANONYMOUS0(type, __LINE__) <br />例：ANONYMOUS(static int);  即: static int _anonymous70;  70表示该行行号； <br />第一层：ANONYMOUS(static int);  --&gt;  __ANONYMOUS0(static int, __LINE__); <br />第二层：                        --&gt;  ___ANONYMOUS1(static int, _anonymous, 70); <br />第三层：                        --&gt;  static int  _anonymous70; <br />即每次只能解开当前层的宏，所以__LINE__在第二层才能被解开； </p>
		<p>2、填充结构 <br />#define  FILL(a)   {a, #a} </p>
		<p>enum IDD{OPEN, CLOSE}; <br />typedef struct MSG{ <br />  IDD id; <br />  const char * msg; <br />}MSG; </p>
		<p>MSG _msg[] = {FILL(OPEN), FILL(CLOSE)}; <br />相当于： <br />MSG _msg[] = {{OPEN, "OPEN"}, <br />              {CLOSE, "CLOSE"}}; </p>
		<p>3、记录文件名 <br />#define  _GET_FILE_NAME(f)   #f <br />#define  GET_FILE_NAME(f)    _GET_FILE_NAME(f) <br />static char  FILE_NAME[] = GET_FILE_NAME(__FILE__); </p>
		<p>4、得到一个数值类型所对应的字符串缓冲大小 <br />#define  _TYPE_BUF_SIZE(type)  sizeof #type <br />#define  TYPE_BUF_SIZE(type)   _TYPE_BUF_SIZE(type) <br />char  buf[TYPE_BUF_SIZE(INT_MAX)]; <br />     --&gt;  char  buf[_TYPE_BUF_SIZE(0x7fffffff)]; <br />     --&gt;  char  buf[sizeof "0x7fffffff"]; <br />这里相当于： <br />char  buf[11]; </p>
<img src ="http://www.blogjava.net/lantin/aggbug/178351.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lantin/" target="_blank">花之剑</a> 2008-01-29 13:35 <a href="http://www.blogjava.net/lantin/articles/178351.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux多线程设计(转)</title><link>http://www.blogjava.net/lantin/articles/178027.html</link><dc:creator>花之剑</dc:creator><author>花之剑</author><pubDate>Sun, 27 Jan 2008 08:09:00 GMT</pubDate><guid>http://www.blogjava.net/lantin/articles/178027.html</guid><wfw:comment>http://www.blogjava.net/lantin/comments/178027.html</wfw:comment><comments>http://www.blogjava.net/lantin/articles/178027.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lantin/comments/commentRss/178027.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lantin/services/trackbacks/178027.html</trackback:ping><description><![CDATA[
		<div class="box2">
				<span class="Tit">
				</span> </div>
		<table class="htb wr" cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<div class="box2 p14">#include &lt;pthread.h&gt;<br /><br />1、创建<br /><br />int pthread_create( pthread_t *tid, const pthread_attr_t *attr, void *(* func) (void *), void *arg );<br /><br />attr: 线程属性包括：优先级、初始栈大小，是否应该成为一个守护线程。<br /><br />缺省设置，NULL<br /><br />后面是线程要执行的函数和参数<br /><br />成功返回 0<br /><br />2、等待一个给定线程终止<br /><br />int pthread_join( pthread_t tid, void **status);<br /><br />statues返回等待线程的返回值<br /><br />3、得到自身的pid<br /><br />pthread_t pthread_self(void);<br /><br />4、pthread_detach函数<br /><br />int pthread_detach( pthread_t pid );<br /><br />把指定的线程转变为脱离状态<br /><br />一个线程或者是可汇合的（joinable，缺省值），或者是脱离的（detached）。当一个可汇合的线程终止时，它的线程ID和退出状态将留到另一个线程对它调用pthread_join。脱离线程却象守护进程：当它们终止的时，所有相关资源都被释放，我们不能等待它们终止。如果一个线程需要知道另一个线程什么时候终止，那就最好好吃第二个线程的可汇合状态。<br /><br />本函数通常由想让自己脱离的线程调用，如下语句<br /><br />pthread_detach( pthread_self() );<br /><br />5、终止一个线程<br /><br />void pthread_exit( void *statue );<br /><br />指针sttus不能指向局部于调用对象，因为线程终止时这样的对象也消失<br /><br />1．线程属性设置<br />我们用pthread_create函数创建一个线程，在这个线程中，我们使用默认参数，即将该函数的第二个参数设为NULL。的确，对大多数程序来说，使用默认属性就够了，但我们还是有必要来了解一下线程的有关属性。<br />属性结构为pthread_attr_t，它同样在头文件pthread.h中定义，属性值不能直接设置，须使用相关函数进行操作，初始化的函数为pthread_attr_init，这个函数必须在pthread_create函数之前调用。属性对象主要包括是否绑定、是否分离、<br />堆栈地址、堆栈大小、优先级。默认的属性为非绑定、非分离、缺省的堆栈、与父进程同样级别的优先级。<br /><br />1．绑定<br />关于线程的绑定，牵涉到另外一个概念：轻进程（LWP：Light Weight Process）。轻进程可以理解为内核线程，它位于用户层和系统层之间。系统对线程资源的分配、对线程的控制是通过轻进程来实现的，一个轻进程可以控制一个或多个线程。默认状况下，启动多少轻进程、哪些轻进程来控制哪些线程是由系统来控制的，这种状况即称为非绑定的。绑定状况下，则顾名思义，即某个线程固定的"绑"在一个轻进程之上。被绑定的线程具有较高的响应速度，这是因为CPU时间片的调度是面向轻进程的，绑定的线程可以保证在需要的时候它总有一个轻进程可用。通过设置被绑定的轻进程的优先级和调度级可以使得绑定的线程满足诸如实时反应之类的要求。<br />　　设置线程绑定状态的函数为 pthread_attr_setscope，它有两个参数，第一个是指向属性结构的指针，第二个是绑定类型，它有两个取值： PTHREAD_SCOPE_SYSTEM（绑定的）和PTHREAD_SCOPE_PROCESS（非绑定的）。下面的代码即创建了一个绑定的线程。<br />＃i nclude &lt;pthread.h&gt;<br />pthread_attr_t attr;<br />pthread_t tid;<br />/*初始化属性值，均设为默认值*/<br />pthread_attr_init(&amp;attr); <br />pthread_attr_setscope(&amp;attr, PTHREAD_SCOPE_SYSTEM);<br />pthread_create(&amp;tid, &amp;attr, (void *) my_function, NULL);<br /><br />2．线程分离状态                                                                                                                                        线程的分离状态决定一个线程以什么样的方式来终止自己。非分离的线程终止时，其线程ID和退出状态将保留，直到另外一个线程调用pthread_join.分离的线程在当它终止时，所有的资源将释放，我们不能等待它终止。                                                                                        设置线程分离状态的函数为 pthread_attr_setdetachstate（pthread_attr_t *attr, int detachstate）。第二个参数可选为PTHREAD_CREATE_DETACHED（分离线程）和 PTHREAD _CREATE_JOINABLE（非分离线程）。这里要注意的一点是，如果设置一个线程为分离线程，而这个线程运行又非常快，它很可能在 pthread_create函数返回之前就终止了，它终止以后就可能将线程号和系统资源移交给其他的线程使用，这样调用pthread_create的线程就得到了错误的线程号。要避免这种情况可以采取一定的同步措施，最简单的方法之一是可以在被创建的线程里调用 pthread_cond_timewait函数，让这个线程等待一会儿，留出足够的时间让函数pthread_create返回。设置一段等待时间，是在多线程编程里常用的方法。<br />3．优先级                                                                                                                                                它存放在结构sched_param中。用函数pthread_attr_getschedparam和函数 pthread_attr_setschedparam进行存放，一般说来，我们总是先取优先级，对取得的值修改后再存放回去。下面即是一段简单的例子。<br /><br />＃i nclude &lt;pthread.h&gt;<br />＃i nclude &lt;sched.h&gt;<br />pthread_attr_t attr; pthread_t tid;<br />sched_param param;<br />int newprio=20; <br />/*初始化属性*/<br />pthread_attr_init(&amp;attr); <br />/*设置优先级*/<br />pthread_attr_getschedparam(&amp;attr, &amp;param);  <br />param.sched_priority=newprio;<br />pthread_attr_setschedparam(&amp;attr, &amp;param);<br />pthread_create(&amp;tid, &amp;attr, (void *)myfunction, myarg);<br /><br />四．线程数据处理                                                                                                                                和进程相比，线程的最大优点之一是数据的共享性，各个进程共享父进程处沿袭的数据段，可以方便的获得、修改数据。但这也给多线程编程带来了许多问题。我们必须当心有多个不同的进程访问相同的变量。许多函数是不可重入的，即同时不能运行一个函数的多个拷贝（除非使用不同的数据段）。在函数中声明的静态变量常常带来问题，函数的返回值也会有问题。因为如果返回的是函数内部静态声明的空间的地址，则在一个线程调用该函数得到地址后使用该地址指向的数据时，别的线程可能调用此函数并修改了这一段数据。在进程中共享的变量必须用关键字volatile来定义，这是为了防止编译器在优化时（如gcc中使用-OX参数）改变它们的使用方式。为了保护变量，我们必须使用信号量、互斥等方法来保证我们对变量的正确使用。<br />1．线程数据                                                                                                                                                在单线程的程序里，有两种基本的数据：全局变量和局部变量。但在多线程程序里，还有第三种数据类型：线程数据（TSD: Thread-Specific Data）。它和全局变量很象，在线程内部，各个函数可以象使用全局变量一样调用它，但它对线程外部的其它线程是不可见的。例如我们常见的变量errno，它返回标准的出错信息。它显然不能是一个局部变量，几乎每个函数都应该可以调用它；但它又不能是一个全局变量，否则在 A线程里输出的很可能是B线程的出错信息。要实现诸如此类的变量，我们就必须使用线程数据。我们为每个线程数据创建一个键，它和这个键相关联，在各个线程里，都使用这个键来指代线程数据，但在不同的线程里，这个键代表的数据是不同的，在同一个线程里，它代表同样的数据内容。<br />　　和线程数据相关的函数主要有4个：创建一个键；为一个键指定线程数据；从一个键读取线程数据；删除键。<br />　　创建键的函数原型为：<br />　　int pthread_key_create __P ((pthread_key_t *__key,void (*__destr_function) (void *)));                                                                                                                                                第一个参数为指向一个键值的指针，第二个参数指明了一个destructor函数，如果这个参数不为空，那么当每个线程结束时，系统将调用这个函数来释放绑定在这个键上的内存块。这个函数常和函数pthread_once ((pthread_once_t*once_control, void (*initroutine) (void)))一起使用，为了让这个键只被创建一次。函数pthread_once声明一个初始化函数，第一次调用pthread_once时它执行这个函数，以后的调用将被它忽略。<br />int pthread_key_delete(pthread_key_t *key);<br />该函数用于删除一个由pthread_key_create 函数调用创建的键。调用成功返回值为0，否则返回错误代码。<br />在下面的例子中，我们创建一个键，并将它和某个数据相关联。我们要定义一个函数 createWindow，这个函数定义一个图形窗口（数据类型为Fl_Window *，这是图形界面开发工具FLTK中的数据类型）。由于各个线程都会调用这个函数，所以我们使用线程数据。<br />/* 声明一个键*/<br />pthread_key_t myWinKey;<br />/* 函数 createWindow */<br />void createWindow ( void ) {<br />Fl_Window * win;<br />static pthread_once_t once= PTHREAD_ONCE_INIT;<br />/* 调用函数createMyKey，创建键*/<br />pthread_once ( &amp; once, createMyKey) ;<br />/*win指向一个新建立的窗口*/<br />win=new Fl_Window( 0, 0, 100, 100, "MyWindow");<br />/* 对此窗口作一些可能的设置工作，如大小、位置、名称等*/<br />setWindow(win);<br />/* 将窗口指针值绑定在键myWinKey上*/<br />pthread_setpecific ( myWinKey, win);<br />}<br />/* 函数 createMyKey，创建一个键，并指定了destructor */<br />void createMyKey ( void ) {<br />pthread_keycreate(&amp;myWinKey, freeWinKey);<br />}<br />/* 函数 freeWinKey，释放空间*/<br />void freeWinKey ( Fl_Window * win){<br />delete win;<br />}<br />这样，在不同的线程中调用函数createMyWin，都可以得到在线程内部均可见的窗口变量，这个变量通过函数 pthread_getspecific得到。在上面的例子中，我们已经使用了函数pthread_setspecific来将线程数据和一个键绑定在一起。这两个函数的原型如下：<br />　　<br />int pthread_setspecific __P ((pthread_key_t __key,__const void *__pointer)); 该函数设置一个线程专有数据的值，赋给由pthread_key_create 创建的键，调用成功返回值为0，否则返回错误代码。<br />void *pthread_getspecific __P ((pthread_key_t __key));                                                 该函数获得绑定到指定键上的值。调用成功，返回给定参数key 所对应的数据。如果没有数据连接到该键，则返回NULL。<br /><br />　　这两个函数的参数意义和使用方法是显而易见的。要注意的是，用pthread_setspecific为一个键指定新的线程数据时，必须自己释放原有的线程数据以回收空间。这个过程函数pthread_key_delete用来删除一个键，这个键占用的内存将被释放，但同样要注意的是，它只释放键占用的内存，并不释放该键关联的线程数据所占用的内存资源，而且它也不会触发函数pthread_key_create中定义的destructor函数。线程数据的释放必须在释放键之前完成。<br />2．互斥锁                                                                                                                                                假设各个现成向同一个文件顺序写入数据，最后得到的结果是不可想象的。所以用互斥锁来保证一段时间内只有一个线程在执行一段代码。<br /><br /><br /><br />使用int pthread_mutex_lock锁住互斥锁，使用int pthread_mutex_unlock解琐。<br />如果我们试图为一个已被其他线程锁住的互斥锁加锁，程序便会阻塞直到该互斥对象解锁。<br />如果在共享内存中分配一个互斥锁，我们必须在运行时调用ptgread_mutex_init函数尽心初始化。<br />void reader_function ( void );<br />void writer_function ( void ); <br />char buffer;<br />int buffer_has_item=0;<br />pthread_mutex_t mutex;<br />struct timespec delay;<br />void main ( void ){<br />pthread_t reader;<br />/* 定义延迟时间*/<br />delay.tv_sec = 2;<br />delay.tv_nec = 0;<br />/* 用默认属性初始化一个互斥锁对象*/<br />pthread_mutex_init (&amp;mutex,NULL);<br />pthread_create(&amp;reader, pthread_attr_default, (void *)&amp;reader_function), NULL);<br />writer_function( );<br />}<br />void writer_function (void){<br />while(1){<br />/* 锁定互斥锁*/<br />pthread_mutex_lock (&amp;mutex);<br />if (buffer_has_item==0){<br />buffer=make_new_item( );<br />buffer_has_item=1;<br />}<br />/* 打开互斥锁*/<br />pthread_mutex_unlock(&amp;mutex);<br />pthread_delay_np(&amp;delay);<br />}<br />}<br />void reader_function(void){<br />while(1){<br />pthread_mutex_lock(&amp;mutex);<br />if(buffer_has_item==1){<br />consume_item(buffer);<br />buffer_has_item=0;<br />}<br />pthread_mutex_unlock(&amp;mutex);<br />pthread_delay_np(&amp;delay);<br />}<br />}<br />函数 pthread_mutex_init用来生成一个互斥锁。NULL参数表明使用默认属性。如果需要声明特定属性的互斥锁，须调用函数 pthread_mutexattr_init。函数pthread_mutexattr_setpshared和函数 pthread_mutexattr_settype用来设置互斥锁属性。前一个函数设置属性pshared，它有两个取值， PTHREAD_PROCESS_PRIVATE和PTHREAD_PROCESS_SHARED。前者用来不同进程中的线程同步，后者用于同步本进程的不同线程。在上面的例子中，我们使用的是默认属性PTHREAD_PROCESS_ PRIVATE。后者用来设置互斥锁类型，可选的类型有PTHREAD_MUTEX_NORMAL、PTHREAD_MUTEX_ERRORCHECK、 PTHREAD_MUTEX_RECURSIVE和PTHREAD _MUTEX_DEFAULT。它们分别定义了不同的上所、解锁机制，一般情况下，选用最后一个默认属性。<br />需要注意的是在使用互斥锁的过程中很有可能会出现死锁：两个线程试图同时占用两个资源，并按不同的次序锁定相应的互斥锁，例如两个线程都需要锁定互斥锁1和互斥锁2，a线程先锁定互斥锁1，b线程先锁定互斥锁2，这时就出现了死锁。此时我们可以使用函数 pthread_mutex_trylock，它是函数pthread_mutex_lock的非阻塞版本，当它发现死锁不可避免时，它会返回相应的信息，程序员可以针对死锁做出相应的处理。另外不同的互斥锁类型对死锁的处理不一样，但最主要的还是要程序员自己在程序设计注意这一点。<br />3．条件变量<br />互斥锁一个明显的缺点是它只有两种状态：锁定和非锁定。而条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足，它常和互斥锁一起使用。使用时，条件变量被用来阻塞一个线程，当条件不满足时，线程往往解开相应的互斥锁并等待条件发生变化。一旦其它的某个线程改变了条件变量，它将通知相应的条件变量唤醒一个或多个正被此条件变量阻塞的线程。这些线程将重新锁定互斥锁并重新测试条件是否满足。一般说来，条件变量被用来进行线承间的同步。<br />条件变量的结构为pthread_cond_t，函数pthread_cond_init（）被用来初始化一个条件变量。它的原型为：<br /><br />int pthread_cond_init __P ((pthread_cond_t *__cond,__const pthread_condattr_t *__cond_attr));<br />          <br />其中cond是一个指向结构pthread_cond_t的指针，cond_attr是一个指向结构pthread_condattr_t的指针。结构 pthread_condattr_t是条件变量的属性结构，和互斥锁一样我们可以用它来设置条件变量是进程内可用还是进程间可用，默认值是 PTHREAD_ PROCESS_PRIVATE，即此条件变量被同一进程内的各个线程使用。注意初始化条件变量只有未被使用时才能重新初始化或被释放。<br />在pthread中，条件变量是一个pthread_cond_t类型的变量，条件变量使用下面两个函数：<br /><br /><br /></div>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/lantin/aggbug/178027.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lantin/" target="_blank">花之剑</a> 2008-01-27 16:09 <a href="http://www.blogjava.net/lantin/articles/178027.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C语言中tm结构体</title><link>http://www.blogjava.net/lantin/articles/177127.html</link><dc:creator>花之剑</dc:creator><author>花之剑</author><pubDate>Tue, 22 Jan 2008 12:15:00 GMT</pubDate><guid>http://www.blogjava.net/lantin/articles/177127.html</guid><wfw:comment>http://www.blogjava.net/lantin/comments/177127.html</wfw:comment><comments>http://www.blogjava.net/lantin/articles/177127.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lantin/comments/commentRss/177127.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lantin/services/trackbacks/177127.html</trackback:ping><description><![CDATA[
		<p>struct tm<br />{<br />  int tm_sec;                   /* Seconds.     [0-60] (1 leap second) */<br />  int tm_min;                   /* Minutes.     [0-59] */<br />  int tm_hour;                  /* Hours.       [0-23] */<br />  int tm_mday;                  /* Day.         [1-31] */<br />  int tm_mon;                   /* Month.       [0-11] */<br />  int tm_year;                  /* Year - 1900.  */<br />  int tm_wday;                  /* Day of week. [0-6] */<br />  int tm_yday;                  /* Days in year.[0-365] */<br />  int tm_isdst;                 /* DST.         [-1/0/1]*/</p>
		<p>#ifdef  __USE_BSD<br />  long int tm_gmtoff;           /* Seconds east of UTC.  */<br />  __const char *tm_zone;        /* Timezone abbreviation.  */<br />#else<br />  long int __tm_gmtoff;         /* Seconds east of UTC.  */<br />  __const char *__tm_zone;      /* Timezone abbreviation.  */<br />#endif<br />};<br /><br />在C语言中 <br />有time_t tm timeval等几种类型的时间<br />1.time_t为typedef __int64 __time64_t; <br />2.struct timeval<br />{<br />      uint tv_sec;<br />      uint tv.usec;<br />}<br /><br /><br /><br />具体操作函数<br />包含文件:&lt;sys/time.h&gt; &lt;time.h&gt; <br /><br />tm *gmtime(time_t * t);<br />time_t time(time_t *t);<br />char *asctime(const struct tm *timeptr);<br />char *ctime(const time_t *timer); <br />把tm指针转换为time_t<br />time_t mktime(struct tm *timeptr);<br />localtime和gmtime的区别在于gmtime将时间转换为国际标准格式，也就是相对于1970 00:00:00开始的时间戳<br />而localtime是相对于本地的时区的格式。<br />#include&lt;stdio.h&gt;<br />#include&lt;time.h&gt;<br />#include&lt;sys/time.h&gt;<br />#include&lt;signal.h&gt;<br />#include&lt;pthread.h&gt;<br />void quit_t()<br />{<br />        printf("eixt now");<br />        exit(-1);<br />}<br />int main()<br />{<br />/*      struct timeval  vt;<br />        gettimeofday(&amp;vt , NULL);<br />        while(1)<br />        {<br />                printf("%u:%u\n",vt.tv_sec,vt.tv_usec);<br />                sleep(2);<br />                signal(SIGINT, quit_t);<br />        }<br />*/</p>
		<p>        struct tm *tt;<br />        time_t t = time(NULL);<br />        tt = gmtime(&amp;t);<br />        //char *s = asctime(tt);<br />        printf("%d-%d-%d %d:%d:%d",tt-&gt;tm_year+1900,tt-&gt;tm_mon+1,tt-&gt;tm_mday,tt-&gt;tm_hour,tt-&gt;tm_min,tt-&gt;tm_sec);<br />        return 0;<br />}<br /></p>
<img src ="http://www.blogjava.net/lantin/aggbug/177127.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lantin/" target="_blank">花之剑</a> 2008-01-22 20:15 <a href="http://www.blogjava.net/lantin/articles/177127.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> MultiByteToWideChar和WideCharToMultiByte用法详解   (转) </title><link>http://www.blogjava.net/lantin/articles/173376.html</link><dc:creator>花之剑</dc:creator><author>花之剑</author><pubDate>Mon, 07 Jan 2008 08:17:00 GMT</pubDate><guid>http://www.blogjava.net/lantin/articles/173376.html</guid><wfw:comment>http://www.blogjava.net/lantin/comments/173376.html</wfw:comment><comments>http://www.blogjava.net/lantin/articles/173376.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lantin/comments/commentRss/173376.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lantin/services/trackbacks/173376.html</trackback:ping><description><![CDATA[
		<div class="postTitle">
				<a name="baidusnap0">
				</a>
				<a href="http://blog.csdn.net/li_007/archive/2007/06/06/1640211.aspx">
						<img height="13" src="http://blog.csdn.net/images/zhuan.gif" width="15" border="0" /> <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">MultiByteToWideChar</b>和WideCharToMultiByte用法详解 </a>   </div>
		<div class="postText">
				<font face="Comic Sans MS" size="4">//========================================================================<br />//TITLE:<br />//    <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">MultiByteToWideChar</b>和WideCharToMultiByte用法详解<br />//AUTHOR:<br />//    norains<br />//DATE:<br />//    第一版:Monday  25-December -2006<br />//    增补版:Wednesday 27-December -2006<br />//    修订版:Wednesday 14-March-2007 (修正之前的错误例子)<br />//Environment:<br />//  EVC4.0 + Standard SDK<br />//========================================================================<br />  <br />1.使用方法详解<br /><br />  在本文开始之处,先简要地说一下何为短字符和宽字符.<br />  所谓的短字符,就是用8bit来表示的字符,典型的应用是ASCII码.而宽字符,顾名思义,就是用16bit表示的字符,典型的有UNICODE.关于windows下的ASCII和UNICODE的更多信息,可以参考这两本经典著作:《windows 程序设计》,《windows 核心编程》.这两本书关于这两种字符都有比较详细的解说.<br />  <br />  宽字符转换为多个短字符是一个难点,不过我们只要掌握到其中的要领,便可如鱼得水.<br />  好吧,那就让我们开始吧.<br />  <br />  这个是我们需要转化的多字节字符串:  <br />  char sText[20] = {"多字节字符串!OK!"};<br />  <br />  我们需要知道转化后的宽字符需要多少个数组空间.虽然在这个里程里面,我们可以直接定义一个20*2宽字符的数组,并且事实上将运行得非常轻松愉快.但假如多字节字符串更多,达到上千个乃至上万个,我们将会发现其中浪费的内存将会越来越多.所以以多字节字符的个数的两倍作为宽字符数组下标的声明绝对不是一个好主意.<br />  所幸,我们能够确知所需要的数组空间.<br />  我们只需要将<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">MultiByteToWideChar</b>()的第四个形参设为-1,即可返回所需的短字符数组空间的个数:<br />  DWORD dwNum = <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">MultiByteToWideChar</b> (CP_ACP, 0, sText, -1, NULL, 0);<br />  <br />  接下来,我们只需要分配响应的数组空间:<br />  wchar_t *pwText;<br />  pwText = new wchar_t[dwNum];<br />  if(!pwText)<br />  {<br />   delete []pwText;<br />  }<br />  <br />  接着,我们就可以着手进行转换了.在这里以转换成ASCII码做为例子:<br />  <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">MultiByteToWideChar</b> (CP_ACP, 0, psText, -1, sText, dwSize);<br />  <br />  最后,使用完毕当然要记得释放占用的内存:<br />  delete []psText;<br />  <br /> <br />  同理,宽字符转为多字节字符的代码如下:  <br />  wchar_t wText[20] = {L"宽字符转换实例!OK!"};<br />  DWORD dwNum = WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,NULL,0,NULL,FALSE);<br />  char *psText;<br />  psText = new char[dwNum];<br />  if(!psText)<br />  {<br />   delete []psText;<br />  }<br />  WideCharToMultiByte (CP_OEMCP,NULL,lpcwszStr,-1,psText,dwNum,NULL,FALSE);<br />  delete []psText;<br />  <br />   如果之前我们已经分配好空间,并且由于字符串较短,可以不理会浪费的空间,仅仅只是想简单地将短字符和宽字符相互转换,那有没有什么简便的方法呢?<br />   WIN32 API里没有符合这种要求的函数,但我们可以自己进行封装:<br />     <br />  //-------------------------------------------------------------------------------------<br />  //Description:<br />  // This function maps a character string to a wide-character (Unicode) string<br />  //<br />  //Parameters:<br />  // lpcszStr: [in] Pointer to the character string to be converted <br />  // lpwszStr: [out] Pointer to a buffer that receives the translated string. <br />  // dwSize: [in] Size of the buffer<br />  //<br />  //Return Values:<br />  // TRUE: Succeed<br />  // FALSE: Failed<br />  // <br />  //Example:<br />  // MByteToWChar(szA,szW,sizeof(szW)/sizeof(szW[0]));<br />  //---------------------------------------------------------------------------------------<br />  BOOL MByteToWChar(LPCSTR lpcszStr, LPWSTR lpwszStr, DWORD dwSize)<br />  {<br />    // Get the required size of the buffer that receives the Unicode <br />    // string. <br />    DWORD dwMinSize;<br />    dwMinSize = <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">MultiByteToWideChar</b> (CP_ACP, 0, lpcszStr, -1, NULL, 0);<br />  <br />    if(dwSize &lt; dwMinSize)<br />    {<br />     return FALSE;<br />    }<br />  <br />    <br />    // Convert headers from ASCII to Unicode.<br />    <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">MultiByteToWideChar</b> (CP_ACP, 0, lpcszStr, -1, lpwszStr, dwMinSize);  <br />    return TRUE;<br />  }<br />  <br />  //-------------------------------------------------------------------------------------<br />  //Description:<br />  // This function maps a wide-character string to a new character string<br />  //<br />  //Parameters:<br />  // lpcwszStr: [in] Pointer to the character string to be converted <br />  // lpszStr: [out] Pointer to a buffer that receives the translated string. <br />  // dwSize: [in] Size of the buffer<br />  //<br />  //Return Values:<br />  // TRUE: Succeed<br />  // FALSE: Failed<br />  // <br />  //Example:<br />  // MByteToWChar(szW,szA,sizeof(szA)/sizeof(szA[0]));<br />  //---------------------------------------------------------------------------------------<br />  BOOL WCharToMByte(LPCWSTR lpcwszStr, LPSTR lpszStr, DWORD dwSize)<br />  {<br />   DWORD dwMinSize;<br />   dwMinSize = WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,NULL,0,NULL,FALSE);<br />   if(dwSize &lt; dwMinSize)<br />   {<br />    return FALSE;<br />   }<br />   WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,lpszStr,dwSize,NULL,FALSE);<br />   return TRUE;<br />  }<br />  <br />  <br />  使用方法也很简单,示例如下:<br />  wchar_t wText[10] = {L"函数示例"};<br />  char sText[20]= {0};<br />  WCharToMByte(wText,sText,sizeof(sText)/sizeof(sText[0]));<br />  MByteToWChar(sText,wText,sizeof(wText)/sizeof(wText[0]));<br />  <br />  这两个函数的缺点在于无法动态分配内存,在转换很长的字符串时可能会浪费较多内存空间;优点是,在不考虑浪费空间的情况下转换较短字符串非常方便.<br /><br />  <br />2.<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">MultiByteToWideChar</b>()函数乱码的问题<br /><br />  有的朋友可能已经发现,在标准的WinCE4.2或WinCE5.0 SDK模拟器下,这个函数都无法正常工作,其转换之后的字符全是乱码.及时更改<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">MultiByteToWideChar</b>()参数也依然如此.<br />  不过这个不是代码问题,其结症在于所定制的操作系统.如果我们定制的操作系统默认语言不是中文,也会出现这种情况.由于标准的SDK默认语言为英文,所以肯定会出现这个问题.而这个问题的解决,不能在简单地更改控制面板的"区域选项"的"默认语言",而是要在系统定制的时候,选择默认语言为"中文".<br />  系统定制时选择默认语言的位置于:<br />  Platform -&gt; Setting... -&gt; locale -&gt; default language ,选择"中文",然后编译即可.<br /><br /></font>
				<p id="TBPingURL">
						<font face="Comic Sans MS" size="4">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1461174</font>
				</p>
				<font face="Comic Sans MS" size="4"> </font>
		</div>
<img src ="http://www.blogjava.net/lantin/aggbug/173376.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lantin/" target="_blank">花之剑</a> 2008-01-07 16:17 <a href="http://www.blogjava.net/lantin/articles/173376.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>网络地址结构解析</title><link>http://www.blogjava.net/lantin/articles/172961.html</link><dc:creator>花之剑</dc:creator><author>花之剑</author><pubDate>Sat, 05 Jan 2008 06:12:00 GMT</pubDate><guid>http://www.blogjava.net/lantin/articles/172961.html</guid><wfw:comment>http://www.blogjava.net/lantin/comments/172961.html</wfw:comment><comments>http://www.blogjava.net/lantin/articles/172961.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lantin/comments/commentRss/172961.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lantin/services/trackbacks/172961.html</trackback:ping><description><![CDATA[
		<p>&lt;netinet/in.h&gt;<br />struct in_addr<br />{<br /> in_addr_t s_addr;</p>
		<p>}</p>
		<p>通用地址结构 用于网络连接 accept bind listen and so on~~~~</p>
		<p>
				<br />&lt;sys/socket.h&gt;<br />struct sockaddr<br />{<br /> unit8_t sa len;<br /> sa_family_t sa_family;<br /> char sa_data[14];<br />}</p>
		<p>int bind(sockfd, (struct sockaddr *), socklen_t);</p>
		<p> char *inet_ntoa(struct in_addr inaddr)  //将网络二进制转化为字符地址<br />in_addr_t inet_aton(char *addr)               //将字符串转化为网络二进制地址</p>
<img src ="http://www.blogjava.net/lantin/aggbug/172961.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lantin/" target="_blank">花之剑</a> 2008-01-05 14:12 <a href="http://www.blogjava.net/lantin/articles/172961.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>原：ACM赛题</title><link>http://www.blogjava.net/lantin/articles/138357.html</link><dc:creator>花之剑</dc:creator><author>花之剑</author><pubDate>Tue, 21 Aug 2007 05:54:00 GMT</pubDate><guid>http://www.blogjava.net/lantin/articles/138357.html</guid><wfw:comment>http://www.blogjava.net/lantin/comments/138357.html</wfw:comment><comments>http://www.blogjava.net/lantin/articles/138357.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/lantin/comments/commentRss/138357.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lantin/services/trackbacks/138357.html</trackback:ping><description><![CDATA[
		<br />
		<!-- message -->
		<div>【题目描述】 两只青蛙在网上相识了，它们聊得很开心，于是觉得很有必要见一面。它们很高兴地发现它们住在同一条纬度线上，于是它们约定各自朝西跳，直到碰面为止。可是它们出发之前忘记了一件很重要的事情，既没有问清楚对方的特征，也没有约定见面的具体位置。不过青蛙们都是很乐观的，它们觉得只要一直朝着某个方向跳下去，总能碰到对方的。但是除非这两只青蛙在同一时间跳到同一点上，不然是永远都不可能碰面的。为了帮助这两只乐观的青蛙，你被要求写一个程序来判断这两只青蛙是否能够碰面，会在什么时候碰面。 我们把这两只青蛙分别叫做青蛙A和青蛙B，并且规定纬度线上东经0度处为原点，由东往西为正方向，单位长度1米，这样我们就得到了一条首尾相接的数轴。设青蛙A的出发点坐标是x，青蛙B的出发点坐标是y。青蛙A一次能跳m米，青蛙B一次能跳n米，两只青蛙跳一次所花费的时间相同。纬度线总长L米。现在要你求出它们跳了几次以后才会碰面。 Input 输入只包括一行5个整数x，y，m，n，L，其中x≠y &lt; 2000000000，0 &lt; m、n &lt; 2000000000，0 &lt; L &lt; 2100000000。 <br /><br />Output 输出碰面所需要的跳跃次数，如果永远不可能碰面则输出一行"Impossible" <br />示例 <br />Sample Input 1 2 3 4 5 Sample Output 4 <br /><br />题目要求； <br />1.程序应该可以运行：通过控制台输入数据，输出数据通过printf给出； <br />2.程序结构明了逻辑缜密、清晰，符合编码规范； <br />3.程序功能正确；程序要注意效率；并且要求根据输入及时确认是否能够相遇，如果不能相遇请及早退出程序；<br /><br />说明：可以将青蛙的路线看坐是一个圆 判断其坐标 如果下一次跳动后将饶过原点 则把坐标转换<br />这样无论青蛙在哪个位置上 都用坐标来表示它  如果两只青蛙坐标相等 则相遇 <br />如果两只青蛙开始的坐标不一样 但是速度一样 那么将永远不能相遇</div>
		<div>
				<br />
				<font face="Courier New" color="#0000bb">int main</font>
				<font face="Courier New">
						<font color="#007700">() <br />{ <br />    </font>
						<font color="#0000bb">long x</font>
						<font color="#007700">,</font>
						<font color="#0000bb">y</font>
						<font color="#007700">,</font>
						<font color="#0000bb">m</font>
						<font color="#007700">,</font>
						<font color="#0000bb">n</font>
						<font color="#007700">,</font>
						<font color="#0000bb">L</font>
				</font>
				<font face="Courier New" color="#007700">; <br />     <br />    </font>
				<font face="Courier New">
						<font color="#ff8000">/* input */ <br />    </font>
						<font color="#0000bb">scanf</font>
						<font color="#007700">(</font>
						<font color="#dd0000">"%ld%ld%ld%ld%ld"</font>
						<font color="#007700">,&amp;</font>
						<font color="#0000bb">x</font>
						<font color="#007700">,&amp;</font>
						<font color="#0000bb">y</font>
						<font color="#007700">,&amp;</font>
						<font color="#0000bb">m</font>
						<font color="#007700">,&amp;</font>
						<font color="#0000bb">n</font>
						<font color="#007700">,&amp;</font>
						<font color="#0000bb">L</font>
				</font>
				<font face="Courier New">
						<font color="#007700">); <br />    if(</font>
						<font color="#0000bb">x</font>
						<font color="#007700">&gt;=</font>
						<font color="#0000bb">2000000000 </font>
						<font color="#007700">|| </font>
						<font color="#0000bb">y</font>
						<font color="#007700">&gt;=</font>
						<font color="#0000bb">2000000000 </font>
						<font color="#007700">|| </font>
						<font color="#0000bb">m</font>
						<font color="#007700">&gt;=</font>
						<font color="#0000bb">2000000000 </font>
						<font color="#007700">|| </font>
						<font color="#0000bb">n</font>
						<font color="#007700">&gt;=</font>
						<font color="#0000bb">2000000000 </font>
						<font color="#007700">|| </font>
						<font color="#0000bb">L</font>
						<font color="#007700">&gt;=</font>
						<font color="#0000bb">2100000000 </font>
						<font color="#007700">|| </font>
						<font color="#0000bb">m</font>
						<font color="#007700">&lt;</font>
						<font color="#0000bb">0 </font>
						<font color="#007700">|| </font>
						<font color="#0000bb">n</font>
						<font color="#007700">&lt;</font>
						<font color="#0000bb">0 </font>
						<font color="#007700">|| </font>
						<font color="#0000bb">L</font>
						<font color="#007700">&lt;</font>
						<font color="#0000bb">0</font>
				</font>
				<font face="Courier New">
						<font color="#007700">) <br />    { <br />        </font>
						<font color="#0000bb">printf</font>
						<font color="#007700">(</font>
						<font color="#dd0000">"input error\n"</font>
				</font>
				<font face="Courier New">
						<font color="#007700">); <br />        exit(-</font>
						<font color="#0000bb">1</font>
				</font>
				<font face="Courier New">
						<font color="#007700">); <br />    } <br />    if(</font>
						<font color="#0000bb">abs</font>
						<font color="#007700">(</font>
						<font color="#0000bb">x</font>
						<font color="#007700">)&gt;</font>
						<font color="#0000bb">L </font>
						<font color="#007700">|| </font>
						<font color="#0000bb">abs</font>
						<font color="#007700">(</font>
						<font color="#0000bb">y</font>
						<font color="#007700">)&gt;</font>
						<font color="#0000bb">L </font>
						<font color="#007700">|| </font>
						<font color="#0000bb">n</font>
						<font color="#007700">&gt;=</font>
						<font color="#0000bb">L </font>
						<font color="#007700">|| </font>
						<font color="#0000bb">m</font>
						<font color="#007700">&gt;=</font>
						<font color="#0000bb">L</font>
				</font>
				<font face="Courier New">
						<font color="#007700">) <br />    { <br />        </font>
						<font color="#0000bb">printf</font>
						<font color="#007700">(</font>
						<font color="#dd0000">"input error\n"</font>
				</font>
				<font face="Courier New">
						<font color="#007700">); <br />        exit(-</font>
						<font color="#0000bb">1</font>
				</font>
				<font face="Courier New">
						<font color="#007700">); <br />    } <br />    if(</font>
						<font color="#0000bb">m</font>
						<font color="#007700">==</font>
						<font color="#0000bb">n</font>
				</font>
				<font face="Courier New">
						<font color="#007700">) <br />    { <br />        </font>
						<font color="#0000bb">printf</font>
						<font color="#007700">(</font>
						<font color="#dd0000">"Impossible\n"</font>
				</font>
				<font face="Courier New">
						<font color="#007700">); <br />        exit(-</font>
						<font color="#0000bb">1</font>
				</font>
				<font face="Courier New">
						<font color="#007700">); <br />    } <br />    </font>
						<font color="#0000bb">x</font>
						<font color="#007700">=(</font>
						<font color="#0000bb">x</font>
						<font color="#007700">&lt;</font>
						<font color="#0000bb">0</font>
						<font color="#007700">)?(</font>
						<font color="#0000bb">L</font>
						<font color="#007700">+</font>
						<font color="#0000bb">x</font>
						<font color="#007700">):</font>
						<font color="#0000bb">x</font>
				</font>
				<font face="Courier New">
						<font color="#007700">; <br />    </font>
						<font color="#0000bb">y</font>
						<font color="#007700">=(</font>
						<font color="#0000bb">y</font>
						<font color="#007700">&lt;</font>
						<font color="#0000bb">0</font>
						<font color="#007700">)?(</font>
						<font color="#0000bb">L</font>
						<font color="#007700">+</font>
						<font color="#0000bb">y</font>
						<font color="#007700">):</font>
						<font color="#0000bb">y</font>
				</font>
				<font face="Courier New">
						<font color="#007700">; <br />    </font>
						<font color="#0000bb">long i</font>
						<font color="#007700">=</font>
						<font color="#0000bb">0</font>
				</font>
				<font face="Courier New">
						<font color="#007700">; <br />    </font>
						<font color="#0000bb">int tag</font>
						<font color="#007700">=</font>
						<font color="#0000bb">0</font>
						<font color="#007700">,</font>
						<font color="#0000bb">num_x</font>
						<font color="#007700">=</font>
						<font color="#0000bb">0</font>
						<font color="#007700">,</font>
						<font color="#0000bb">num_y</font>
						<font color="#007700">,</font>
						<font color="#0000bb">xlabel</font>
						<font color="#007700">=</font>
						<font color="#0000bb">x</font>
						<font color="#007700">,</font>
						<font color="#0000bb">ylabel</font>
						<font color="#007700">=</font>
						<font color="#0000bb">y</font>
				</font>
				<font face="Courier New">
						<font color="#007700">; <br />    while(</font>
						<font color="#0000bb">1</font>
				</font>
				<font face="Courier New">
						<font color="#007700">) <br />    { <br />        if(</font>
						<font color="#0000bb">x</font>
						<font color="#007700">==</font>
						<font color="#0000bb">y</font>
						<font color="#007700">) {</font>
						<font color="#0000bb">tag</font>
						<font color="#007700">=</font>
						<font color="#0000bb">1</font>
						<font color="#007700">;break;}            </font>
				</font>
				<font face="Courier New">
						<font color="#ff8000">/*如果x=y说明坐标一致 符合*/ <br />        </font>
						<font color="#0000bb">i</font>
				</font>
				<font face="Courier New" color="#007700">++; <br />        </font>
				<font face="Courier New">
						<font color="#ff8000">/*坐标转换*/ <br />        </font>
						<font color="#007700">if(</font>
						<font color="#0000bb">m</font>
						<font color="#007700">&gt;=</font>
						<font color="#0000bb">L</font>
						<font color="#007700">-</font>
						<font color="#0000bb">x</font>
				</font>
				<font face="Courier New">
						<font color="#007700">) <br />        { <br />            </font>
						<font color="#0000bb">x</font>
						<font color="#007700">=</font>
						<font color="#0000bb">m</font>
						<font color="#007700">-</font>
						<font color="#0000bb">L</font>
						<font color="#007700">+</font>
						<font color="#0000bb">x</font>
				</font>
				<font face="Courier New">
						<font color="#007700">; <br />            if(</font>
						<font color="#0000bb">num_x</font>
						<font color="#007700">==</font>
						<font color="#0000bb">0 </font>
						<font color="#007700">&amp;&amp; </font>
						<font color="#0000bb">x</font>
						<font color="#007700">==</font>
						<font color="#0000bb">xlabel</font>
						<font color="#007700">) {</font>
						<font color="#0000bb">tag</font>
						<font color="#007700">=</font>
						<font color="#0000bb">0</font>
				</font>
				<font face="Courier New">
						<font color="#007700">;break;} <br />            else </font>
						<font color="#0000bb">num_x</font>
						<font color="#007700">=</font>
						<font color="#0000bb">1</font>
				</font>
				<font face="Courier New">
						<font color="#007700">; <br />        }else </font>
						<font color="#0000bb">x</font>
						<font color="#007700">+=</font>
						<font color="#0000bb">m</font>
				</font>
				<font face="Courier New">
						<font color="#007700">; <br />        if(</font>
						<font color="#0000bb">n</font>
						<font color="#007700">&gt;=</font>
						<font color="#0000bb">L</font>
						<font color="#007700">-</font>
						<font color="#0000bb">y</font>
				</font>
				<font face="Courier New">
						<font color="#007700">) <br />        { <br />            </font>
						<font color="#0000bb">y</font>
						<font color="#007700">=</font>
						<font color="#0000bb">n</font>
						<font color="#007700">-</font>
						<font color="#0000bb">L</font>
						<font color="#007700">+</font>
						<font color="#0000bb">y</font>
				</font>
				<font face="Courier New">
						<font color="#007700">; <br />            if(</font>
						<font color="#0000bb">num_y</font>
						<font color="#007700">==</font>
						<font color="#0000bb">0 </font>
						<font color="#007700">&amp;&amp; </font>
						<font color="#0000bb">y</font>
						<font color="#007700">==</font>
						<font color="#0000bb">ylabel</font>
						<font color="#007700">) {</font>
						<font color="#0000bb">tag</font>
						<font color="#007700">=</font>
						<font color="#0000bb">0</font>
				</font>
				<font face="Courier New">
						<font color="#007700">;break;} <br />            else  </font>
						<font color="#0000bb">num_y</font>
						<font color="#007700">=</font>
						<font color="#0000bb">1</font>
				</font>
				<font face="Courier New">
						<font color="#007700">; <br />        }else </font>
						<font color="#0000bb">y</font>
						<font color="#007700">+=</font>
						<font color="#0000bb">n</font>
				</font>
				<font face="Courier New">
						<font color="#007700">;         <br /><br />    } <br />    if(</font>
						<font color="#0000bb">tag</font>
						<font color="#007700">==</font>
						<font color="#0000bb">1</font>
				</font>
				<font face="Courier New">
						<font color="#007700">) <br />        </font>
						<font color="#0000bb">printf</font>
						<font color="#007700">(</font>
						<font color="#dd0000">"success,jump:%ld"</font>
						<font color="#007700">,</font>
						<font color="#0000bb">i</font>
				</font>
				<font face="Courier New">
						<font color="#007700">); <br />    else </font>
						<font color="#0000bb">printf</font>
						<font color="#007700">(</font>
						<font color="#dd0000">"Impossible"</font>
				</font>
				<font face="Courier New">
						<font color="#007700">); <br />    return </font>
						<font color="#0000bb">0</font>
				</font>
				<font face="Courier New" color="#007700">; <br /><br />} </font>
				<br />
				<br />测试数据<br />第一组：<br />8954 52146 5896 324 158963<br />将跳跃9808</div>
		<div>第二组：<br />56 95 58 58 693258<br />Impossible</div>
<img src ="http://www.blogjava.net/lantin/aggbug/138357.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lantin/" target="_blank">花之剑</a> 2007-08-21 13:54 <a href="http://www.blogjava.net/lantin/articles/138357.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>字符串hash算法比较 AND 经典HASH函数</title><link>http://www.blogjava.net/lantin/articles/138006.html</link><dc:creator>花之剑</dc:creator><author>花之剑</author><pubDate>Sun, 19 Aug 2007 16:01:00 GMT</pubDate><guid>http://www.blogjava.net/lantin/articles/138006.html</guid><wfw:comment>http://www.blogjava.net/lantin/comments/138006.html</wfw:comment><comments>http://www.blogjava.net/lantin/articles/138006.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lantin/comments/commentRss/138006.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lantin/services/trackbacks/138006.html</trackback:ping><description><![CDATA[
		<div class="tit">字符串hash算法比较</div>
		<div class="date">2007-06-03 11:29</div>
		<table style="TABLE-LAYOUT: fixed">
				<tbody>
						<tr>
								<td>
										<div class="cnt">
												<p>
														<strong>字符串的算法一般大公司都会考到，我们首先要想到高效的hash。如百度查找一组字符串是否出现在某个文本中，这个不是考什么kmp，他们想听到的是hash。趋势科技考的是从某个文本中删除一组字符串，我想也是要hash吧。</strong>
												</p>
												<p>
														<strong>1 概述</strong>
												</p>
												<table width="100%" border="0">
														<tbody>
																<tr>
																		<td class="a14">链表<font size="+0">查找</font>的时间效率为O(N)，二分法为log2N，B+ Tree为log2N，但<font size="+0">Hash</font>链表<font size="+0">查找</font>的时间效率为O(1)。</td>
																</tr>
														</tbody>
												</table>设计高效算法往往需要使用<font size="+0">Hash</font>链表，常数级的<font size="+0">查找</font>速度是任何别的算法无法比拟的，<font size="+0">Hash</font>链表的构造和冲突的不同实现方法对效率当然有一定的影响，然 而<font size="+0">Hash</font>函数是<font size="+0">Hash</font>链表最核心的部分，本文尝试分析一些经典软件中使用到的字符串<font size="+0">Hash</font>函数在执行效率、离散性、空间利用率等方面的性能问题。 
<div><div><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><strong>2 经典字符串<font size="+0">Hash</font>函数介绍</strong></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">作者阅读过大量经典软件原代码，下面分别介绍几个经典软件中出现的字符串<font size="+0">Hash</font>函数。</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><strong>2.1 PHP中出现的字符串<font size="+0">Hash</font>函数</strong></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">static unsigned long <font size="+0">hash</font>pjw(char *arKey, unsigned int nKeyLength)</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">{</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">unsigned long h = 0, g;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">char *arEnd=arKey+nKeyLength;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><br /></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">while (arKey &lt; arEnd) {</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">h = (h &lt;&lt; 4) + *arKey++;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">if ((g = (h &amp; 0xF0000000))) {</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">h = h ^ (g &gt;&gt; 24);</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">h = h ^ g;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">}</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">}</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">return h;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">}</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><strong>2.2 OpenSSL中出现的字符串<font size="+0">Hash</font>函数</strong></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">unsigned long lh_str<font size="+0">hash</font>(char *str)</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">{</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">int i,l;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">unsigned long ret=0;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">unsigned short *s;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><br /></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">if (str == NULL) return(0);</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">l=(strlen(str)+1)/2;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">s=(unsigned short *)str;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">for (i=0; i</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">ret^=(s[i]&lt;&lt;(i&amp;0x0f));</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">return(ret);</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">} */</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><br /></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">/* The following <font size="+0">hash</font> seems to work very well on normal text strings</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">* no collisions on /usr/dict/words and it distributes on %2^n quite</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">* well, not as good as MD5, but still good.</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">*/</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">unsigned long lh_str<font size="+0">hash</font>(const char *c)</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">{</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">unsigned long ret=0;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">long n;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">unsigned long v;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">int r;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><br /></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">if ((c == NULL) || (*c == '\0'))</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">return(ret);</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">/*</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">unsigned char b[16];</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">MD5(c,strlen(c),b);</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">return(b[0]|(b[1]&lt;&lt;8)|(b[2]&lt;&lt;16)|(b[3]&lt;&lt;24)); </td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">*/</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><br /></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">n=0x100;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">while (*c)</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">{</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">v=n|(*c);</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">n+=0x100;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">r= (int)((v&gt;&gt;2)^v)&amp;0x0f;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">ret=(ret(32-r));</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">ret&amp;=0xFFFFFFFFL;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">ret^=v*v;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">c++;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">}</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">return((ret&gt;&gt;16)^ret);</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">}</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">在下面的测量过程中我们分别将上面的两个函数标记为OpenSSL_<font size="+0">Hash</font>1和OpenSSL_<font size="+0">Hash</font>2，至于上面的实现中使用MD5算法的实现函数我们不作测试。</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><strong>2.3 MySql中出现的字符串<font size="+0">Hash</font>函数</strong></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">#ifndef NEW_<font size="+0">HASH</font>_FUNCTION</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><br /></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">/* Calc <font size="+0">hash</font>value for a key */</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><br /></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">static uint calc_<font size="+0">hash</font>nr(const byte *key,uint length)</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">{</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">register uint nr=1, nr2=4;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">while (length--)</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">{</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">nr^= (((nr &amp; 63)+nr2)*((uint) (uchar) *key++))+ (nr &lt;&lt; 8);</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">nr2+=3;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">}</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">return((uint) nr);</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">}</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><br /></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">/* Calc <font size="+0">hash</font>value for a key, case indepenently */</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><br /></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">static uint calc_<font size="+0">hash</font>nr_caseup(const byte *key,uint length)</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">{</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">register uint nr=1, nr2=4;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">while (length--)</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">{</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">nr^= (((nr &amp; 63)+nr2)*((uint) (uchar) toupper(*key++)))+ (nr &lt;&lt; 8);</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">nr2+=3;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">}</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">return((uint) nr);</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">}</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><br /></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">#else</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><br /></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">/*</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">* Fowler/Noll/Vo <font size="+0">hash</font></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">*</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">* The basis of the <font size="+0">hash</font> algorithm was taken from an idea sent by email to the</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">* IEEE Posix P1003.2 mailing list from Phong Vo (kpv@research.att.com) and</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">* Glenn Fowler (gsf@research.att.com). Landon Curt Noll (chongo@toad.com)</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">* later improved on their algorithm.</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">*</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">* The magic is in the interesting relationship between the special prime</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">* 16777619 (2^24 + 403) and 2^32 and 2^8.</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">*</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">* This <font size="+0">hash</font> produces the fewest collisions of any function that we've seen so</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">* far, and works well on both numbers and strings.</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">*/</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><br /></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">uint calc_<font size="+0">hash</font>nr(const byte *key, uint len)</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">{</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">const byte *end=key+len;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">uint <font size="+0">hash</font>;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">for (<font size="+0">hash</font> = 0; key &lt; end; key++)</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">{</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><font size="+0">hash</font> *= 16777619;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><font size="+0">hash</font> ^= (uint) *(uchar*) key;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">}</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">return (<font size="+0">hash</font>);</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">}</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><br /></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">uint calc_<font size="+0">hash</font>nr_caseup(const byte *key, uint len)</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">{</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">const byte *end=key+len;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">uint <font size="+0">hash</font>;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">for (<font size="+0">hash</font> = 0; key &lt; end; key++)</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">{</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><font size="+0">hash</font> *= 16777619;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><font size="+0">hash</font> ^= (uint) (uchar) toupper(*key);</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">}</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">return (<font size="+0">hash</font>);</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">}</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><br /></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">#endif</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">Mysql中对字符串<font size="+0">Hash</font>函数还区分了大小写，我们的测试中使用不区分大小写的字符串<font size="+0">Hash</font>函数，另外我们将上面的两个函数分别记为MYSQL_<font size="+0">Hash</font>1和MYSQL_<font size="+0">Hash</font>2。</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><strong>2.4 另一个经验字符串<font size="+0">Hash</font>函数</strong></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">unsigned int <font size="+0">hash</font>(char *str)</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">{</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">register unsigned int h;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">register unsigned char *p;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><br /></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">for(h=0, p = (unsigned char *)str; *p ; p++)</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">h = 31 * h + *p;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><br /></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">return h;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">}</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><strong>3 测试及结果</strong></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><strong>3.1 测试说明</strong></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">从上面给出的经典字符串<font size="+0">Hash</font>函数中可以看出，有的涉及到字符串大小敏感问题，我们的测试中只考虑字符串大小写敏感的函数，另外在上面的函数中有的函数 需要长度参数，有的不需要长度参数，这对函数本身的效率有一定的影响，我们的测试中将对函数稍微作一点修改，全部使用长度参数，并将函数内部出现的计算长 度代码删除。</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">我们用来作测试用的<font size="+0">Hash</font>链表采用经典的拉链法解决冲突，另外我们采用静态分配桶（<font size="+0">Hash</font>链表长度）的方法来构造<font size="+0">Hash</font>链表，这主要是为了简化我们的实现，并不影响我们的测试结果。</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">测试文本采用单词表，测试过程中从一个输入文件中读取全部不重复单词构造一个<font size="+0">Hash</font>表，测试内容分别是函数总调用次数、函数总调用时间、最大拉链长度、 平均拉链长度、桶利用率（使用过的桶所占的比率），其中函数总调用次数是指<font size="+0">Hash</font>函数被调用的总次数，为了测试出函数执行时间，该值在测试过程中作了一 定的放大，函数总调用时间是指<font size="+0">Hash</font>函数总的执行时间，最大拉链长度是指使用拉链法构造链表过程中出现的最大拉链长度，平均拉链长度指拉链的平均长度。 </td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">测试过程中使用的机器配置如下：</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">PIII600笔记本，128M内存，windows 2000 server操作系统。</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><strong>3.2 测试结果</strong></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">以下分别是对两个不同文本文件中的全部不重复单词构造<font size="+0">Hash</font>链表的测试结果，测试结果中函数调用次数放大了100倍，相应的函数调用时间也放大了100倍。</td></tr></tbody></table><strong></strong><table height="22" width="100%" border="0"><tbody><tr><td class="a14" height="18"><p align="center"><img src="http://www.ccw.com.cn/htm/app/aprog/01_8_22_3a.jpg" border="0" /></p></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><p align="center"><img src="http://www.ccw.com.cn/htm/app/aprog/01_8_22_3b.jpg" border="0" /></p></td></tr></tbody></table><strong>从上表可以看出，这些经典软件虽然构造字符串<font size="+0">Hash</font>函数的方法不同，但是它们的效率都是不错的，相互之间差距很小，读者可以参考实际情况从其中借鉴使用。 </strong></div></div></div>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/lantin/aggbug/138006.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lantin/" target="_blank">花之剑</a> 2007-08-20 00:01 <a href="http://www.blogjava.net/lantin/articles/138006.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>字符串hash算法比较 AND 经典HASH函数</title><link>http://www.blogjava.net/lantin/articles/138007.html</link><dc:creator>花之剑</dc:creator><author>花之剑</author><pubDate>Sun, 19 Aug 2007 16:01:00 GMT</pubDate><guid>http://www.blogjava.net/lantin/articles/138007.html</guid><wfw:comment>http://www.blogjava.net/lantin/comments/138007.html</wfw:comment><comments>http://www.blogjava.net/lantin/articles/138007.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lantin/comments/commentRss/138007.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lantin/services/trackbacks/138007.html</trackback:ping><description><![CDATA[
		<div class="tit">字符串hash算法比较</div>
		<div class="date">2007-06-03 11:29</div>
		<table style="TABLE-LAYOUT: fixed">
				<tbody>
						<tr>
								<td>
										<div class="cnt">
												<p>
														<strong>字符串的算法一般大公司都会考到，我们首先要想到高效的hash。如百度查找一组字符串是否出现在某个文本中，这个不是考什么kmp，他们想听到的是hash。趋势科技考的是从某个文本中删除一组字符串，我想也是要hash吧。</strong>
												</p>
												<p>
														<strong>1 概述</strong>
												</p>
												<table width="100%" border="0">
														<tbody>
																<tr>
																		<td class="a14">链表<font size="+0">查找</font>的时间效率为O(N)，二分法为log2N，B+ Tree为log2N，但<font size="+0">Hash</font>链表<font size="+0">查找</font>的时间效率为O(1)。</td>
																</tr>
														</tbody>
												</table>设计高效算法往往需要使用<font size="+0">Hash</font>链表，常数级的<font size="+0">查找</font>速度是任何别的算法无法比拟的，<font size="+0">Hash</font>链表的构造和冲突的不同实现方法对效率当然有一定的影响，然 而<font size="+0">Hash</font>函数是<font size="+0">Hash</font>链表最核心的部分，本文尝试分析一些经典软件中使用到的字符串<font size="+0">Hash</font>函数在执行效率、离散性、空间利用率等方面的性能问题。 
<div><div><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><strong>2 经典字符串<font size="+0">Hash</font>函数介绍</strong></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">作者阅读过大量经典软件原代码，下面分别介绍几个经典软件中出现的字符串<font size="+0">Hash</font>函数。</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><strong>2.1 PHP中出现的字符串<font size="+0">Hash</font>函数</strong></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">static unsigned long <font size="+0">hash</font>pjw(char *arKey, unsigned int nKeyLength)</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">{</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">unsigned long h = 0, g;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">char *arEnd=arKey+nKeyLength;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><br /></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">while (arKey &lt; arEnd) {</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">h = (h &lt;&lt; 4) + *arKey++;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">if ((g = (h &amp; 0xF0000000))) {</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">h = h ^ (g &gt;&gt; 24);</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">h = h ^ g;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">}</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">}</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">return h;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">}</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><strong>2.2 OpenSSL中出现的字符串<font size="+0">Hash</font>函数</strong></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">unsigned long lh_str<font size="+0">hash</font>(char *str)</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">{</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">int i,l;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">unsigned long ret=0;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">unsigned short *s;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><br /></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">if (str == NULL) return(0);</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">l=(strlen(str)+1)/2;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">s=(unsigned short *)str;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">for (i=0; i</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">ret^=(s[i]&lt;&lt;(i&amp;0x0f));</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">return(ret);</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">} */</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><br /></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">/* The following <font size="+0">hash</font> seems to work very well on normal text strings</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">* no collisions on /usr/dict/words and it distributes on %2^n quite</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">* well, not as good as MD5, but still good.</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">*/</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">unsigned long lh_str<font size="+0">hash</font>(const char *c)</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">{</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">unsigned long ret=0;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">long n;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">unsigned long v;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">int r;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><br /></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">if ((c == NULL) || (*c == '\0'))</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">return(ret);</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">/*</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">unsigned char b[16];</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">MD5(c,strlen(c),b);</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">return(b[0]|(b[1]&lt;&lt;8)|(b[2]&lt;&lt;16)|(b[3]&lt;&lt;24)); </td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">*/</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><br /></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">n=0x100;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">while (*c)</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">{</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">v=n|(*c);</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">n+=0x100;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">r= (int)((v&gt;&gt;2)^v)&amp;0x0f;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">ret=(ret(32-r));</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">ret&amp;=0xFFFFFFFFL;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">ret^=v*v;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">c++;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">}</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">return((ret&gt;&gt;16)^ret);</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">}</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">在下面的测量过程中我们分别将上面的两个函数标记为OpenSSL_<font size="+0">Hash</font>1和OpenSSL_<font size="+0">Hash</font>2，至于上面的实现中使用MD5算法的实现函数我们不作测试。</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><strong>2.3 MySql中出现的字符串<font size="+0">Hash</font>函数</strong></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">#ifndef NEW_<font size="+0">HASH</font>_FUNCTION</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><br /></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">/* Calc <font size="+0">hash</font>value for a key */</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><br /></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">static uint calc_<font size="+0">hash</font>nr(const byte *key,uint length)</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">{</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">register uint nr=1, nr2=4;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">while (length--)</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">{</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">nr^= (((nr &amp; 63)+nr2)*((uint) (uchar) *key++))+ (nr &lt;&lt; 8);</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">nr2+=3;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">}</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">return((uint) nr);</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">}</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><br /></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">/* Calc <font size="+0">hash</font>value for a key, case indepenently */</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><br /></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">static uint calc_<font size="+0">hash</font>nr_caseup(const byte *key,uint length)</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">{</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">register uint nr=1, nr2=4;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">while (length--)</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">{</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">nr^= (((nr &amp; 63)+nr2)*((uint) (uchar) toupper(*key++)))+ (nr &lt;&lt; 8);</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">nr2+=3;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">}</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">return((uint) nr);</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">}</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><br /></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">#else</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><br /></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">/*</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">* Fowler/Noll/Vo <font size="+0">hash</font></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">*</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">* The basis of the <font size="+0">hash</font> algorithm was taken from an idea sent by email to the</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">* IEEE Posix P1003.2 mailing list from Phong Vo (kpv@research.att.com) and</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">* Glenn Fowler (gsf@research.att.com). Landon Curt Noll (chongo@toad.com)</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">* later improved on their algorithm.</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">*</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">* The magic is in the interesting relationship between the special prime</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">* 16777619 (2^24 + 403) and 2^32 and 2^8.</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">*</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">* This <font size="+0">hash</font> produces the fewest collisions of any function that we've seen so</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">* far, and works well on both numbers and strings.</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">*/</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><br /></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">uint calc_<font size="+0">hash</font>nr(const byte *key, uint len)</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">{</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">const byte *end=key+len;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">uint <font size="+0">hash</font>;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">for (<font size="+0">hash</font> = 0; key &lt; end; key++)</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">{</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><font size="+0">hash</font> *= 16777619;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><font size="+0">hash</font> ^= (uint) *(uchar*) key;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">}</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">return (<font size="+0">hash</font>);</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">}</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><br /></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">uint calc_<font size="+0">hash</font>nr_caseup(const byte *key, uint len)</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">{</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">const byte *end=key+len;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">uint <font size="+0">hash</font>;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">for (<font size="+0">hash</font> = 0; key &lt; end; key++)</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">{</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><font size="+0">hash</font> *= 16777619;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><font size="+0">hash</font> ^= (uint) (uchar) toupper(*key);</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">}</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">return (<font size="+0">hash</font>);</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">}</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><br /></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">#endif</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">Mysql中对字符串<font size="+0">Hash</font>函数还区分了大小写，我们的测试中使用不区分大小写的字符串<font size="+0">Hash</font>函数，另外我们将上面的两个函数分别记为MYSQL_<font size="+0">Hash</font>1和MYSQL_<font size="+0">Hash</font>2。</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><strong>2.4 另一个经验字符串<font size="+0">Hash</font>函数</strong></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">unsigned int <font size="+0">hash</font>(char *str)</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">{</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">register unsigned int h;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">register unsigned char *p;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><br /></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">for(h=0, p = (unsigned char *)str; *p ; p++)</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">h = 31 * h + *p;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><br /></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">return h;</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">}</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><strong>3 测试及结果</strong></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><strong>3.1 测试说明</strong></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">从上面给出的经典字符串<font size="+0">Hash</font>函数中可以看出，有的涉及到字符串大小敏感问题，我们的测试中只考虑字符串大小写敏感的函数，另外在上面的函数中有的函数 需要长度参数，有的不需要长度参数，这对函数本身的效率有一定的影响，我们的测试中将对函数稍微作一点修改，全部使用长度参数，并将函数内部出现的计算长 度代码删除。</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">我们用来作测试用的<font size="+0">Hash</font>链表采用经典的拉链法解决冲突，另外我们采用静态分配桶（<font size="+0">Hash</font>链表长度）的方法来构造<font size="+0">Hash</font>链表，这主要是为了简化我们的实现，并不影响我们的测试结果。</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">测试文本采用单词表，测试过程中从一个输入文件中读取全部不重复单词构造一个<font size="+0">Hash</font>表，测试内容分别是函数总调用次数、函数总调用时间、最大拉链长度、 平均拉链长度、桶利用率（使用过的桶所占的比率），其中函数总调用次数是指<font size="+0">Hash</font>函数被调用的总次数，为了测试出函数执行时间，该值在测试过程中作了一 定的放大，函数总调用时间是指<font size="+0">Hash</font>函数总的执行时间，最大拉链长度是指使用拉链法构造链表过程中出现的最大拉链长度，平均拉链长度指拉链的平均长度。 </td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">测试过程中使用的机器配置如下：</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">PIII600笔记本，128M内存，windows 2000 server操作系统。</td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><strong>3.2 测试结果</strong></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14">以下分别是对两个不同文本文件中的全部不重复单词构造<font size="+0">Hash</font>链表的测试结果，测试结果中函数调用次数放大了100倍，相应的函数调用时间也放大了100倍。</td></tr></tbody></table><strong></strong><table height="22" width="100%" border="0"><tbody><tr><td class="a14" height="18"><p align="center"><img src="http://www.ccw.com.cn/htm/app/aprog/01_8_22_3a.jpg" border="0" /></p></td></tr></tbody></table><strong></strong><table width="100%" border="0"><tbody><tr><td class="a14"><p align="center"><img src="http://www.ccw.com.cn/htm/app/aprog/01_8_22_3b.jpg" border="0" /></p></td></tr></tbody></table><strong>从上表可以看出，这些经典软件虽然构造字符串<font size="+0">Hash</font>函数的方法不同，但是它们的效率都是不错的，相互之间差距很小，读者可以参考实际情况从其中借鉴使用。 </strong></div></div></div>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/lantin/aggbug/138007.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lantin/" target="_blank">花之剑</a> 2007-08-20 00:01 <a href="http://www.blogjava.net/lantin/articles/138007.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转:常用的几种排序算法</title><link>http://www.blogjava.net/lantin/articles/137954.html</link><dc:creator>花之剑</dc:creator><author>花之剑</author><pubDate>Sun, 19 Aug 2007 08:36:00 GMT</pubDate><guid>http://www.blogjava.net/lantin/articles/137954.html</guid><wfw:comment>http://www.blogjava.net/lantin/comments/137954.html</wfw:comment><comments>http://www.blogjava.net/lantin/articles/137954.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lantin/comments/commentRss/137954.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lantin/services/trackbacks/137954.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 常见的排序算法																						排序算法																																																																																						本文总结内部排序（数据在内存中而不是存储在文件中）的一些经典算法，对《数据结构》中相关知识给予...&nbsp;&nbsp;<a href='http://www.blogjava.net/lantin/articles/137954.html'>阅读全文</a><img src ="http://www.blogjava.net/lantin/aggbug/137954.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lantin/" target="_blank">花之剑</a> 2007-08-19 16:36 <a href="http://www.blogjava.net/lantin/articles/137954.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>原：二叉树排序算法</title><link>http://www.blogjava.net/lantin/articles/137951.html</link><dc:creator>花之剑</dc:creator><author>花之剑</author><pubDate>Sun, 19 Aug 2007 08:23:00 GMT</pubDate><guid>http://www.blogjava.net/lantin/articles/137951.html</guid><wfw:comment>http://www.blogjava.net/lantin/comments/137951.html</wfw:comment><comments>http://www.blogjava.net/lantin/articles/137951.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lantin/comments/commentRss/137951.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lantin/services/trackbacks/137951.html</trackback:ping><description><![CDATA[
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080"> 1</span>
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #008000">/*</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080"> 2</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> *利用二叉树排序<br /></span>
				<span style="COLOR: #008080"> 3</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> *<br /></span>
				<span style="COLOR: #008080"> 4</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #008000">*/</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 5</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #008000">#</span>
				<span style="COLOR: #008000">include &lt;stdio.h&gt;</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080"> 6</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#</span>
				<span style="COLOR: #008000">include&lt;stdlib.h&gt;</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080"> 7</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#</span>
				<span style="COLOR: #008000">include&lt;ctype.h&gt;</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080"> 8</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#</span>
				<span style="COLOR: #008000">include&lt;string.h&gt;</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080"> 9</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#</span>
				<span style="COLOR: #008000">define MAXLEN  10<br /></span>
				<span style="COLOR: #008080">10</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />//结构体</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080">11</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">struct tnode<br /></span>
				<span style="COLOR: #008080">12</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />{<br /></span>
				<span style="COLOR: #008080">13</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    int num;<br /></span>
				<span style="COLOR: #008080">14</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    struct tnode </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">left;<br /></span>
				<span style="COLOR: #008080">15</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    struct tnode </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">right;<br /></span>
				<span style="COLOR: #008080">16</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />}q;<br /></span>
				<span style="COLOR: #008080">17</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080">18</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">二叉有序树 左支小右支大</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080">19</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">struct tnode </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">addtree(struct tnode </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">p</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">int n)<br /></span>
				<span style="COLOR: #008080">20</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />{<br /></span>
				<span style="COLOR: #008080">21</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    int cond;<br /></span>
				<span style="COLOR: #008080">22</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #0000ff">if</span>
				<span style="COLOR: #000000">(p</span>
				<span style="COLOR: #000000">==</span>
				<span style="COLOR: #0000ff">NULL</span>
				<span style="COLOR: #000000">)<br /></span>
				<span style="COLOR: #008080">23</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    {<br /></span>
				<span style="COLOR: #008080">24</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        p</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">(struct tnode </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">) malloc(</span>
				<span style="COLOR: #008080">sizeof</span>
				<span style="COLOR: #000000">(q));<br /></span>
				<span style="COLOR: #008080">25</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        p</span>
				<span style="COLOR: #000000">-&gt;</span>
				<span style="COLOR: #000000">num    </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">    n;<br /></span>
				<span style="COLOR: #008080">26</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        p</span>
				<span style="COLOR: #000000">-&gt;</span>
				<span style="COLOR: #000000">left</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">p</span>
				<span style="COLOR: #000000">-&gt;</span>
				<span style="COLOR: #000000">right</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #0000ff">NULL</span>
				<span style="COLOR: #000000">;<br /></span>
				<span style="COLOR: #008080">27</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    }</span>
				<span style="COLOR: #0000ff">else</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">if</span>
				<span style="COLOR: #000000">(n</span>
				<span style="COLOR: #000000">&lt;=</span>
				<span style="COLOR: #000000">p</span>
				<span style="COLOR: #000000">-&gt;</span>
				<span style="COLOR: #000000">num)<br /></span>
				<span style="COLOR: #008080">28</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    {<br /></span>
				<span style="COLOR: #008080">29</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        p</span>
				<span style="COLOR: #000000">-&gt;</span>
				<span style="COLOR: #000000">left</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">addtree(p</span>
				<span style="COLOR: #000000">-&gt;</span>
				<span style="COLOR: #000000">left</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">n);<br /></span>
				<span style="COLOR: #008080">30</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    }</span>
				<span style="COLOR: #0000ff">else</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">31</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        p</span>
				<span style="COLOR: #000000">-&gt;</span>
				<span style="COLOR: #000000">right</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">addtree(p</span>
				<span style="COLOR: #000000">-&gt;</span>
				<span style="COLOR: #000000">right</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">n);<br /></span>
				<span style="COLOR: #008080">32</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #0000ff">return</span>
				<span style="COLOR: #000000"> p;<br /></span>
				<span style="COLOR: #008080">33</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080">34</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />}<br /></span>
				<span style="COLOR: #008080">35</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080">36</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">打印出排序后的树</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080">37</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">void treeprint(struct tnode </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">p)<br /></span>
				<span style="COLOR: #008080">38</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />{<br /></span>
				<span style="COLOR: #008080">39</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #0000ff">if</span>
				<span style="COLOR: #000000"> (p</span>
				<span style="COLOR: #000000">!=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">NULL</span>
				<span style="COLOR: #000000">) {<br /></span>
				<span style="COLOR: #008080">40</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    treeprint(p</span>
				<span style="COLOR: #000000">-&gt;</span>
				<span style="COLOR: #000000">left);<br /></span>
				<span style="COLOR: #008080">41</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #008080">printf</span>
				<span style="COLOR: #000000">(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">%4d \n</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000"> p</span>
				<span style="COLOR: #000000">-&gt;</span>
				<span style="COLOR: #000000">num);<br /></span>
				<span style="COLOR: #008080">42</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    treeprint(p</span>
				<span style="COLOR: #000000">-&gt;</span>
				<span style="COLOR: #000000">right);<br /></span>
				<span style="COLOR: #008080">43</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    }</span>
				<span style="COLOR: #0000ff">else</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">return</span>
				<span style="COLOR: #000000"> ;<br /></span>
				<span style="COLOR: #008080">44</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />}<br /></span>
				<span style="COLOR: #008080">45</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />int main(int argc</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000"> char </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">argv[])<br /></span>
				<span style="COLOR: #008080">46</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />{<br /></span>
				<span style="COLOR: #008080">47</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    int a[MAXLEN]</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">i</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">j;<br /></span>
				<span style="COLOR: #008080">48</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    char c;<br /></span>
				<span style="COLOR: #008080">49</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    struct tnode </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">root;<br /></span>
				<span style="COLOR: #008080">50</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    root</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #0000ff">NULL</span>
				<span style="COLOR: #000000">;<br /></span>
				<span style="COLOR: #008080">51</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #0000ff">for</span>
				<span style="COLOR: #000000">(i</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">0</span>
				<span style="COLOR: #000000">;i</span>
				<span style="COLOR: #000000">!=</span>
				<span style="COLOR: #000000">MAXLEN;i</span>
				<span style="COLOR: #000000">++</span>
				<span style="COLOR: #000000">)<br /></span>
				<span style="COLOR: #008080">52</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    {<br /></span>
				<span style="COLOR: #008080">53</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        scanf(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">%d</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">,&amp;</span>
				<span style="COLOR: #000000">a[i]);<br /></span>
				<span style="COLOR: #008080">54</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        root</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">addtree(root</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">a[i]);<br /></span>
				<span style="COLOR: #008080">55</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    }<br /></span>
				<span style="COLOR: #008080">56</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    treeprint(root);<br /></span>
				<span style="COLOR: #008080">57</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #0000ff">return</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">0</span>
				<span style="COLOR: #000000">;<br /></span>
				<span style="COLOR: #008080">58</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />}<br /></span>
				<span style="COLOR: #008080">59</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
		</div>
<img src ="http://www.blogjava.net/lantin/aggbug/137951.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lantin/" target="_blank">花之剑</a> 2007-08-19 16:23 <a href="http://www.blogjava.net/lantin/articles/137951.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>统计文本中相同词出现的频率 c programing language</title><link>http://www.blogjava.net/lantin/articles/137944.html</link><dc:creator>花之剑</dc:creator><author>花之剑</author><pubDate>Sun, 19 Aug 2007 07:16:00 GMT</pubDate><guid>http://www.blogjava.net/lantin/articles/137944.html</guid><wfw:comment>http://www.blogjava.net/lantin/comments/137944.html</wfw:comment><comments>http://www.blogjava.net/lantin/articles/137944.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lantin/comments/commentRss/137944.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lantin/services/trackbacks/137944.html</trackback:ping><description><![CDATA[
		<p> </p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080"> 1</span>
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 2</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #008000">#</span>
				<span style="COLOR: #008000">include &lt;stdio.h&gt;</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080"> 3</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#</span>
				<span style="COLOR: #008000">include&lt;stdlib.h&gt;</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080"> 4</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#</span>
				<span style="COLOR: #008000">include&lt;ctype.h&gt;</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080"> 5</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#</span>
				<span style="COLOR: #008000">include&lt;string.h&gt;</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080"> 6</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#</span>
				<span style="COLOR: #008000">define MAXLEN  100</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080"> 7</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">struct tnode<br /></span>
				<span style="COLOR: #008080"> 8</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />{<br /></span>
				<span style="COLOR: #008080"> 9</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> char </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">word;<br /></span>
				<span style="COLOR: #008080">10</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> int </span>
				<span style="COLOR: #008080">count</span>
				<span style="COLOR: #000000">;<br /></span>
				<span style="COLOR: #008080">11</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> struct tnode </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">left;<br /></span>
				<span style="COLOR: #008080">12</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> struct tnode </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">right;<br /></span>
				<span style="COLOR: #008080">13</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />}q;<br /></span>
				<span style="COLOR: #008080">14</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />int getword( char </span>
				<span style="COLOR: #000000">*,</span>
				<span style="COLOR: #000000">int);<br /></span>
				<span style="COLOR: #008080">15</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />struct tnode </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">addtree(struct tnode </span>
				<span style="COLOR: #000000">*,</span>
				<span style="COLOR: #000000">char </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">word);<br /></span>
				<span style="COLOR: #008080">16</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />char </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">strduup(char </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">s);<br /></span>
				<span style="COLOR: #008080">17</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />int getword(char </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">word</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">int limit)<br /></span>
				<span style="COLOR: #008080">18</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />{<br /></span>
				<span style="COLOR: #008080">19</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> int i;</span>
				<span style="COLOR: #008000">/*</span>
				<span style="COLOR: #008000"> 0表示为是词外，1表示在词内</span>
				<span style="COLOR: #008000">*/</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">20</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> char c;<br /></span>
				<span style="COLOR: #008080">21</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> char </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">w</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">word;<br /></span>
				<span style="COLOR: #008080">22</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #0000ff">while</span>
				<span style="COLOR: #000000">(isspace(c</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">getchar()));<br /></span>
				<span style="COLOR: #008080">23</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #0000ff">if</span>
				<span style="COLOR: #000000"> (c </span>
				<span style="COLOR: #000000">!=</span>
				<span style="COLOR: #000000"> EOF)<br /></span>
				<span style="COLOR: #008080">24</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">word</span>
				<span style="COLOR: #000000">++</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> c;<br /></span>
				<span style="COLOR: #008080">25</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #0000ff">if</span>
				<span style="COLOR: #000000"> (</span>
				<span style="COLOR: #000000">!</span>
				<span style="COLOR: #000000">isalpha(c)) {<br /></span>
				<span style="COLOR: #008080">26</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">word </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">'</span>
				<span style="COLOR: #000000">\0</span>
				<span style="COLOR: #000000">'</span>
				<span style="COLOR: #000000">;<br /></span>
				<span style="COLOR: #008080">27</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span>
				<span style="COLOR: #0000ff">return</span>
				<span style="COLOR: #000000"> c ;<br /></span>
				<span style="COLOR: #008080">28</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> }<br /></span>
				<span style="COLOR: #008080">29</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080">30</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #0000ff">for</span>
				<span style="COLOR: #000000">(i</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">0</span>
				<span style="COLOR: #000000">;(c</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">getchar())</span>
				<span style="COLOR: #000000">!=</span>
				<span style="COLOR: #000000">EOF </span>
				<span style="COLOR: #000000">&amp;&amp;</span>
				<span style="COLOR: #000000"> i</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">limit;i</span>
				<span style="COLOR: #000000">++</span>
				<span style="COLOR: #000000">)<br /></span>
				<span style="COLOR: #008080">31</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> {<br /></span>
				<span style="COLOR: #008080">32</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span>
				<span style="COLOR: #0000ff">if</span>
				<span style="COLOR: #000000">(</span>
				<span style="COLOR: #000000">!</span>
				<span style="COLOR: #000000">isalnum(</span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">word</span>
				<span style="COLOR: #000000">++=</span>
				<span style="COLOR: #000000">c))<br /></span>
				<span style="COLOR: #008080">33</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  {<br /></span>
				<span style="COLOR: #008080">34</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />   </span>
				<span style="COLOR: #0000ff">break</span>
				<span style="COLOR: #000000">;<br /></span>
				<span style="COLOR: #008080">35</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  }<br /></span>
				<span style="COLOR: #008080">36</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> }<br /></span>
				<span style="COLOR: #008080">37</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">word</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">'</span>
				<span style="COLOR: #000000">\0</span>
				<span style="COLOR: #000000">'</span>
				<span style="COLOR: #000000">;<br /></span>
				<span style="COLOR: #008080">38</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #0000ff">return</span>
				<span style="COLOR: #000000"> w[</span>
				<span style="COLOR: #000000">0</span>
				<span style="COLOR: #000000">];<br /></span>
				<span style="COLOR: #008080">39</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />}<br /></span>
				<span style="COLOR: #008080">40</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />struct tnode </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">addtree(struct tnode </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">p</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">char </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">word)<br /></span>
				<span style="COLOR: #008080">41</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />{<br /></span>
				<span style="COLOR: #008080">42</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> int cond;<br /></span>
				<span style="COLOR: #008080">43</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #0000ff">if</span>
				<span style="COLOR: #000000">(p</span>
				<span style="COLOR: #000000">==</span>
				<span style="COLOR: #0000ff">NULL</span>
				<span style="COLOR: #000000">)<br /></span>
				<span style="COLOR: #008080">44</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> {<br /></span>
				<span style="COLOR: #008080">45</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  p</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">(struct tnode </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">) malloc(</span>
				<span style="COLOR: #008080">sizeof</span>
				<span style="COLOR: #000000">(q));<br /></span>
				<span style="COLOR: #008080">46</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  p</span>
				<span style="COLOR: #000000">-&gt;</span>
				<span style="COLOR: #000000">word</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">strduup(word);<br /></span>
				<span style="COLOR: #008080">47</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  p</span>
				<span style="COLOR: #000000">-&gt;</span>
				<span style="COLOR: #000000">left</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">p</span>
				<span style="COLOR: #000000">-&gt;</span>
				<span style="COLOR: #000000">right</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #0000ff">NULL</span>
				<span style="COLOR: #000000">;<br /></span>
				<span style="COLOR: #008080">48</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  p</span>
				<span style="COLOR: #000000">-&gt;</span>
				<span style="COLOR: #008080">count</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">1</span>
				<span style="COLOR: #000000">;<br /></span>
				<span style="COLOR: #008080">49</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> }</span>
				<span style="COLOR: #0000ff">else</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">if</span>
				<span style="COLOR: #000000">((cond</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #008080">strcmp</span>
				<span style="COLOR: #000000">(word</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">p</span>
				<span style="COLOR: #000000">-&gt;</span>
				<span style="COLOR: #000000">word))</span>
				<span style="COLOR: #000000">==</span>
				<span style="COLOR: #000000">0</span>
				<span style="COLOR: #000000">)<br /></span>
				<span style="COLOR: #008080">50</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> {<br /></span>
				<span style="COLOR: #008080">51</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  p</span>
				<span style="COLOR: #000000">-&gt;</span>
				<span style="COLOR: #008080">count</span>
				<span style="COLOR: #000000">++</span>
				<span style="COLOR: #000000">;<br /></span>
				<span style="COLOR: #008080">52</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> }</span>
				<span style="COLOR: #0000ff">else</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">if</span>
				<span style="COLOR: #000000">(cond</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">0</span>
				<span style="COLOR: #000000">)<br /></span>
				<span style="COLOR: #008080">53</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> {<br /></span>
				<span style="COLOR: #008080">54</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  p</span>
				<span style="COLOR: #000000">-&gt;</span>
				<span style="COLOR: #000000">left</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">addtree(p</span>
				<span style="COLOR: #000000">-&gt;</span>
				<span style="COLOR: #000000">left</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">word);<br /></span>
				<span style="COLOR: #008080">55</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> }</span>
				<span style="COLOR: #0000ff">else</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">56</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  p</span>
				<span style="COLOR: #000000">-&gt;</span>
				<span style="COLOR: #000000">right</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">addtree(p</span>
				<span style="COLOR: #000000">-&gt;</span>
				<span style="COLOR: #000000">right</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">word);<br /></span>
				<span style="COLOR: #008080">57</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #0000ff">return</span>
				<span style="COLOR: #000000"> p;<br /></span>
				<span style="COLOR: #008080">58</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080">59</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />}<br /></span>
				<span style="COLOR: #008080">60</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080">61</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />char </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">strduup(char </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">s) </span>
				<span style="COLOR: #008000">/*</span>
				<span style="COLOR: #008000"> make a duplicate of s </span>
				<span style="COLOR: #008000">*/</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">62</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />{<br /></span>
				<span style="COLOR: #008080">63</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> char </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">p;<br /></span>
				<span style="COLOR: #008080">64</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> p </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> (char </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">) malloc(</span>
				<span style="COLOR: #008080">strlen</span>
				<span style="COLOR: #000000">(s)</span>
				<span style="COLOR: #000000">+</span>
				<span style="COLOR: #000000">1</span>
				<span style="COLOR: #000000">); </span>
				<span style="COLOR: #008000">/*</span>
				<span style="COLOR: #008000"> +1 for '\0' </span>
				<span style="COLOR: #008000">*/</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">65</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #0000ff">if</span>
				<span style="COLOR: #000000"> (p </span>
				<span style="COLOR: #000000">!=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">NULL</span>
				<span style="COLOR: #000000">)<br /></span>
				<span style="COLOR: #008080">66</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> strcpy(p</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000"> s);<br /></span>
				<span style="COLOR: #008080">67</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #0000ff">return</span>
				<span style="COLOR: #000000"> p;<br /></span>
				<span style="COLOR: #008080">68</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />}<br /></span>
				<span style="COLOR: #008080">69</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080">70</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #008000">/*</span>
				<span style="COLOR: #008000"> treeprint: in-order print of tree p </span>
				<span style="COLOR: #008000">*/</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">71</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />void treeprint(struct tnode </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">p)<br /></span>
				<span style="COLOR: #008080">72</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />{<br /></span>
				<span style="COLOR: #008080">73</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">if</span>
				<span style="COLOR: #000000"> (p </span>
				<span style="COLOR: #000000">!=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">NULL</span>
				<span style="COLOR: #000000">) {<br /></span>
				<span style="COLOR: #008080">74</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />treeprint(p</span>
				<span style="COLOR: #000000">-&gt;</span>
				<span style="COLOR: #000000">left);<br /></span>
				<span style="COLOR: #008080">75</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #008080">printf</span>
				<span style="COLOR: #000000">(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">%4d %s\n</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000"> p</span>
				<span style="COLOR: #000000">-&gt;</span>
				<span style="COLOR: #008080">count</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000"> p</span>
				<span style="COLOR: #000000">-&gt;</span>
				<span style="COLOR: #000000">word);<br /></span>
				<span style="COLOR: #008080">76</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />treeprint(p</span>
				<span style="COLOR: #000000">-&gt;</span>
				<span style="COLOR: #000000">right);<br /></span>
				<span style="COLOR: #008080">77</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />}<br /></span>
				<span style="COLOR: #008080">78</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />}<br /></span>
				<span style="COLOR: #008080">79</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />int main(int argc</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000"> char </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">argv[])<br /></span>
				<span style="COLOR: #008080">80</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />{<br /></span>
				<span style="COLOR: #008080">81</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> char word[MAXLEN];<br /></span>
				<span style="COLOR: #008080">82</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> struct tnode </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">root;<br /></span>
				<span style="COLOR: #008080">83</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> root</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #0000ff">NULL</span>
				<span style="COLOR: #000000">;<br /></span>
				<span style="COLOR: #008080">84</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #0000ff">while</span>
				<span style="COLOR: #000000">(getword(word</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">MAXLEN)</span>
				<span style="COLOR: #000000">!=</span>
				<span style="COLOR: #000000">EOF)<br /></span>
				<span style="COLOR: #008080">85</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> {<br /></span>
				<span style="COLOR: #008080">86</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  root</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">addtree(root</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">word);<br /></span>
				<span style="COLOR: #008080">87</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> }<br /></span>
				<span style="COLOR: #008080">88</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> treeprint(root);<br /></span>
				<span style="COLOR: #008080">89</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #0000ff">return</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">0</span>
				<span style="COLOR: #000000">;<br /></span>
				<span style="COLOR: #008080">90</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />}<br /></span>
				<span style="COLOR: #008080">91</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080">92</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080">93</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
		</div>
<img src ="http://www.blogjava.net/lantin/aggbug/137944.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lantin/" target="_blank">花之剑</a> 2007-08-19 15:16 <a href="http://www.blogjava.net/lantin/articles/137944.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C function declaration</title><link>http://www.blogjava.net/lantin/articles/137803.html</link><dc:creator>花之剑</dc:creator><author>花之剑</author><pubDate>Sat, 18 Aug 2007 05:07:00 GMT</pubDate><guid>http://www.blogjava.net/lantin/articles/137803.html</guid><wfw:comment>http://www.blogjava.net/lantin/comments/137803.html</wfw:comment><comments>http://www.blogjava.net/lantin/articles/137803.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lantin/comments/commentRss/137803.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lantin/services/trackbacks/137803.html</trackback:ping><description><![CDATA[
		<p>char **argv<br />argv: pointer to char<br />int (*daytab)[13]<br />daytab: pointer to array[13] of int<br />int *daytab[13]<br />daytab: array[13] of pointer to int<br />void *comp()<br />comp: function returning pointer to void<br />void (*comp)()<br />comp: pointer to function returning void<br />char (*(*x())[])()<br />x: function returning pointer to array[] of<br />pointer to function returning char<br />char (*(*x[3])())[5]<br />x: array[3] of pointer to function returning<br />pointer to array[5] of char</p>
<img src ="http://www.blogjava.net/lantin/aggbug/137803.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lantin/" target="_blank">花之剑</a> 2007-08-18 13:07 <a href="http://www.blogjava.net/lantin/articles/137803.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C笔记 变量</title><link>http://www.blogjava.net/lantin/articles/137681.html</link><dc:creator>花之剑</dc:creator><author>花之剑</author><pubDate>Fri, 17 Aug 2007 11:39:00 GMT</pubDate><guid>http://www.blogjava.net/lantin/articles/137681.html</guid><wfw:comment>http://www.blogjava.net/lantin/comments/137681.html</wfw:comment><comments>http://www.blogjava.net/lantin/articles/137681.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lantin/comments/commentRss/137681.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lantin/services/trackbacks/137681.html</trackback:ping><description><![CDATA[static 在函数内部，表示该变量的值在各个调用间一直保持延续性 在函数这一级，表示该函数对本文件可见<br>extern 用于函数的定义，表示全局可见（属于冗余） 用于变量 表示它在其他地方定义<br>X&gt;&gt;4 等与X/2^4<br>.的优先级高于*&nbsp;&nbsp; &nbsp;*p.f=*(p.f)=*(p-&gt;f)<br>[]高于*&nbsp;&nbsp;&nbsp;int *ap[]=int *(ap[]);<br>函数()高于*&nbsp;&nbsp;fp是个函数，返回int* int *(fp())<br>算术运算符号高于位运算符&nbsp;msb&lt;&lt;4+lsb=msb&lt;&lt;(4+lsb);<br>逗号运算符在所有运算符中的优先级最低&nbsp;i=1,2=(i=1),2; 最后i=2;<br>gets并不安全，可能会导致堆栈覆盖的问题，因此可以采用fgets代替gets<br>例如:<br>char a[20];<br>fgets(a,20,stdin);//从标准输入中读取<br>fgets(a.20,fp)&nbsp;//从文件中读取<br>用fgets读取的一个特点是在a[strlen(a)-1)中的字符为\n，如果想过滤掉的话<br>可以采用a[strlen(a)-1]='\0'<br>sizeof(c)是指分配的空间大小，而strlen是里面存在多少个非 \0字符<br>写入到标准输出采用fputs(c,FILE *FP)<br>第三章 声明<br>初始化指针内存的字符串常量被定义为只读，如果试图通过指针修改这个字符串的值，程序会出现未定义的行为。<br>为了加快运算速度，可以将频繁使用的局部变量声明为register变量，只有局部自动变量才能做为寄存变量<br>用extern声明外部变量<br>a.out文件里面包含数据段和文本段 数据段存放全局变量和静态变量，文本段存放的是程序指令<br>寄存器变量只适合于函数的形式参数和自动变量 速度快 小<br>由于硬件的问题 对寄存器变量会有一些限制 在每一个函数中只有少量的变量可以放在寄存器中
<img src ="http://www.blogjava.net/lantin/aggbug/137681.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lantin/" target="_blank">花之剑</a> 2007-08-17 19:39 <a href="http://www.blogjava.net/lantin/articles/137681.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>原创：去除程序中所有的注释</title><link>http://www.blogjava.net/lantin/articles/137388.html</link><dc:creator>花之剑</dc:creator><author>花之剑</author><pubDate>Thu, 16 Aug 2007 12:53:00 GMT</pubDate><guid>http://www.blogjava.net/lantin/articles/137388.html</guid><wfw:comment>http://www.blogjava.net/lantin/comments/137388.html</wfw:comment><comments>http://www.blogjava.net/lantin/articles/137388.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lantin/comments/commentRss/137388.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lantin/services/trackbacks/137388.html</trackback:ping><description><![CDATA[<p>/*去掉所有注解*/<br>#include&lt;stdlib.h&gt;<br>#include&lt;stdio.h&gt;<br>int main()<br>{<br>&nbsp;char *s;<br>&nbsp;char c;<br>&nbsp;int&nbsp; tag=0,n=0,quto=0;<br>&nbsp;while((c=getchar())!=EOF)<br>&nbsp;{<br>&nbsp;&nbsp;if(quto==0)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;if(c=='/' &amp;&amp; tag==0) tag=1;<br>&nbsp;&nbsp;&nbsp;else if(tag==1 &amp;&amp; c=='/') tag=2; //<br>&nbsp;&nbsp;&nbsp;else if(tag==1 &amp;&amp; c=='*') tag=3;<br>&nbsp;&nbsp;&nbsp;else if(c=='*') &nbsp;&nbsp; n=1;<br>&nbsp;&nbsp;&nbsp;else if(n=1 &amp;&amp; c=='/')&nbsp;&nbsp; n=2;<br>&nbsp;&nbsp;&nbsp;else if(tag==0 &amp;&amp; c=='"') quto=1;</p>
<p>&nbsp;&nbsp;&nbsp;if(tag==2)<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;if(c!='\n')<br>&nbsp;&nbsp;&nbsp;&nbsp;continue;<br>&nbsp;&nbsp;&nbsp;&nbsp;else tag=0;<br>&nbsp;&nbsp;&nbsp;}else if(tag==3) <br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;if(n==2)<br>&nbsp;&nbsp;&nbsp;&nbsp;{tag=0;n=0;}<br>&nbsp;&nbsp;&nbsp;&nbsp;continue;<br>&nbsp;&nbsp;&nbsp;}else if(tag==1)<br>&nbsp;&nbsp;&nbsp;&nbsp;continue;<br>&nbsp;&nbsp;&nbsp;putchar(c);<br>&nbsp;&nbsp;}else if(quto==1)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;putchar(c);<br>&nbsp;&nbsp;&nbsp;if(c=='"') <br>&nbsp;&nbsp;&nbsp; quto=0;<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;}<br>&nbsp;return 0;</p>
<p>}<br></p>
<img src ="http://www.blogjava.net/lantin/aggbug/137388.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lantin/" target="_blank">花之剑</a> 2007-08-16 20:53 <a href="http://www.blogjava.net/lantin/articles/137388.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>BUG</title><link>http://www.blogjava.net/lantin/articles/134435.html</link><dc:creator>花之剑</dc:creator><author>花之剑</author><pubDate>Sat, 04 Aug 2007 13:26:00 GMT</pubDate><guid>http://www.blogjava.net/lantin/articles/134435.html</guid><wfw:comment>http://www.blogjava.net/lantin/comments/134435.html</wfw:comment><comments>http://www.blogjava.net/lantin/articles/134435.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lantin/comments/commentRss/134435.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lantin/services/trackbacks/134435.html</trackback:ping><description><![CDATA[1.&nbsp;&nbsp;&nbsp;NUL表示结束ASCII字符串 和'\0'相识&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; NULL表示指针什么也不指向<br>2.const int a=2 a不是常数。<br>在switch中<br>switch(i)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case a:statement;break;&nbsp; //出错<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default://<br>}<br>case语句需要强制退出 <br>break是退出离他最近的那个switch语句
<img src ="http://www.blogjava.net/lantin/aggbug/134435.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lantin/" target="_blank">花之剑</a> 2007-08-04 21:26 <a href="http://www.blogjava.net/lantin/articles/134435.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>qsort用法快速排序算法</title><link>http://www.blogjava.net/lantin/articles/134422.html</link><dc:creator>花之剑</dc:creator><author>花之剑</author><pubDate>Sat, 04 Aug 2007 10:15:00 GMT</pubDate><guid>http://www.blogjava.net/lantin/articles/134422.html</guid><wfw:comment>http://www.blogjava.net/lantin/comments/134422.html</wfw:comment><comments>http://www.blogjava.net/lantin/articles/134422.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lantin/comments/commentRss/134422.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lantin/services/trackbacks/134422.html</trackback:ping><description><![CDATA[int cmp(const void * a  , const void * b) <br />{ <br />return *(int *)a - *(int *) b; <br />} <br /><em><br />qsort(a,n,sizeof(int),cmp);//排序 <br /><table class="tborder" id="post6909797" style="TABLE-LAYOUT: fixed; WORD-WRAP: break-word" cellspacing="1" cellpadding="6" width="100%" align="center" border="0"><tbody><tr><td class="thead" id="currentPost" width="175"><!-- / status icon and date --></td><td class="thead" id="currentPost" align="right"></td></tr><tr valign="top"><td class="alt2" width="175"><!-- user info --><div class="smallfont"><div> </div></div></td><!-- / user info --><td class="alt2"><br /><!-- message --><div><div style="MARGIN: 5px 20px 20px"><div class="smallfont" style="MARGIN-BOTTOM: 2px">PHP代码:</div><div class="alt2" style="BORDER-RIGHT: 1px inset; PADDING-RIGHT: 6px; BORDER-TOP: 1px inset; PADDING-LEFT: 6px; PADDING-BOTTOM: 6px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: 1px inset; WIDTH: 640px; PADDING-TOP: 6px; BORDER-BOTTOM: 1px inset; HEIGHT: 498px"><code style="WHITE-SPACE: nowrap"><!-- php buffer start --><code><font color="#000000"><font color="#0000bb"></font><font color="#ff8000">#include&lt;stdio.h&gt; <br />#include&lt;stdlib.h&gt; <br /></font><font color="#0000bb">void swap</font><font color="#007700">(</font><font color="#0000bb">int </font><font color="#007700">*</font><font color="#0000bb">p</font><font color="#007700">,</font><font color="#0000bb">int </font><font color="#007700">*</font><font color="#0000bb">q</font><font color="#007700">) <br />{ <br />    </font><font color="#0000bb">int t</font><font color="#007700">=*</font><font color="#0000bb">p</font><font color="#007700">; <br />    *</font><font color="#0000bb">p</font><font color="#007700">=*</font><font color="#0000bb">q</font><font color="#007700">; <br />    *</font><font color="#0000bb">q</font><font color="#007700">=</font><font color="#0000bb">t</font><font color="#007700">; <br />} <br /></font><font color="#0000bb">void qsort_test</font><font color="#007700">(</font><font color="#0000bb">int a</font><font color="#007700">[],</font><font color="#0000bb">int lower</font><font color="#007700">,</font><font color="#0000bb">int high</font><font color="#007700">) <br />{ <br />    </font><font color="#0000bb">int p</font><font color="#007700">=</font><font color="#0000bb">lower</font><font color="#007700">; <br />    </font><font color="#0000bb">int l</font><font color="#007700">=</font><font color="#0000bb">lower</font><font color="#007700">-</font><font color="#0000bb">1</font><font color="#007700">,</font><font color="#0000bb">n</font><font color="#007700">=</font><font color="#0000bb">0</font><font color="#007700">,</font><font color="#0000bb">t</font><font color="#007700">=</font><font color="#0000bb">a</font><font color="#007700">[</font><font color="#0000bb">high</font><font color="#007700">]; <br />    if(</font><font color="#0000bb">lower</font><font color="#007700">&gt;=</font><font color="#0000bb">high</font><font color="#007700">) return ; <br />    while(</font><font color="#0000bb">lower</font><font color="#007700">&lt;</font><font color="#0000bb">high</font><font color="#007700">) <br />    { <br />        if(</font><font color="#0000bb">a</font><font color="#007700">[</font><font color="#0000bb">lower</font><font color="#007700">]&lt;=</font><font color="#0000bb">t</font><font color="#007700">) <br />        {     <br />            </font><font color="#0000bb">l</font><font color="#007700">++; <br />            if(</font><font color="#0000bb">n</font><font color="#007700">&gt;</font><font color="#0000bb">0</font><font color="#007700">) <br />                </font><font color="#0000bb">swap</font><font color="#007700">(&amp;</font><font color="#0000bb">a</font><font color="#007700">[</font><font color="#0000bb">l</font><font color="#007700">],&amp;</font><font color="#0000bb">a</font><font color="#007700">[</font><font color="#0000bb">lower</font><font color="#007700">]);     <br />        }else </font><font color="#0000bb">n</font><font color="#007700">++; <br />        </font><font color="#0000bb">lower</font><font color="#007700">++; <br />    } <br />    </font><font color="#0000bb">l</font><font color="#007700">++; <br />    </font><font color="#0000bb">swap</font><font color="#007700">(&amp;</font><font color="#0000bb">a</font><font color="#007700">[</font><font color="#0000bb">l</font><font color="#007700">],&amp;</font><font color="#0000bb">a</font><font color="#007700">[</font><font color="#0000bb">high</font><font color="#007700">]); <br />    </font><font color="#0000bb">qsort_test</font><font color="#007700">(</font><font color="#0000bb">a</font><font color="#007700">,</font><font color="#0000bb">p</font><font color="#007700">,</font><font color="#0000bb">l</font><font color="#007700">-</font><font color="#0000bb">1</font><font color="#007700">); <br />    </font><font color="#0000bb">qsort_test</font><font color="#007700">(</font><font color="#0000bb">a</font><font color="#007700">,</font><font color="#0000bb">l</font><font color="#007700">+</font><font color="#0000bb">1</font><font color="#007700">,</font><font color="#0000bb">high</font><font color="#007700">); <br /><br />} <br /></font><font color="#0000bb">int main</font><font color="#007700">() <br />{ <br />               </font><font color="#0000bb">printf</font><font color="#007700">(</font><font color="#dd0000">"请输入10个数\n"</font><font color="#007700">); <br />    </font><font color="#0000bb">int a</font><font color="#007700">[</font><font color="#0000bb">10</font><font color="#007700">]; <br />    </font><font color="#0000bb">int i</font><font color="#007700">; <br />    for(</font><font color="#0000bb">i</font><font color="#007700">=</font><font color="#0000bb">0</font><font color="#007700">;</font><font color="#0000bb">i</font><font color="#007700">&lt;</font><font color="#0000bb">10</font><font color="#007700">;</font><font color="#0000bb">i</font><font color="#007700">++) <br />    </font><font color="#0000bb">scanf</font><font color="#007700">(</font><font color="#dd0000">"%d"</font><font color="#007700">,&amp;</font><font color="#0000bb">a</font><font color="#007700">[</font><font color="#0000bb">i</font><font color="#007700">]); <br />                       for(</font><font color="#0000bb">i</font><font color="#007700">=</font><font color="#0000bb">0</font><font color="#007700">;</font><font color="#0000bb">i</font><font color="#007700">&lt;</font><font color="#0000bb">10</font><font color="#007700">;</font><font color="#0000bb">i</font><font color="#007700">++) <br />    </font><font color="#0000bb">qsort_test</font><font color="#007700">(</font><font color="#0000bb">a</font><font color="#007700">,</font><font color="#0000bb">0</font><font color="#007700">,</font><font color="#0000bb">9</font><font color="#007700">); <br />    for(</font><font color="#0000bb">i</font><font color="#007700">=</font><font color="#0000bb">0</font><font color="#007700">;</font><font color="#0000bb">i</font><font color="#007700">&lt;</font><font color="#0000bb">10</font><font color="#007700">;</font><font color="#0000bb">i</font><font color="#007700">++) <br />    </font><font color="#0000bb">printf</font><font color="#007700">(</font><font color="#dd0000">"%d  "</font><font color="#007700">,</font><font color="#0000bb">a</font><font color="#007700">[</font><font color="#0000bb">i</font><font color="#007700">]); <br />     return </font><font color="#0000bb">0</font><font color="#007700">; <br />} </font></font></code></code></div></div></div></td></tr></tbody></table></em><img src ="http://www.blogjava.net/lantin/aggbug/134422.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lantin/" target="_blank">花之剑</a> 2007-08-04 18:15 <a href="http://www.blogjava.net/lantin/articles/134422.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>从stand input 读入一行</title><link>http://www.blogjava.net/lantin/articles/134372.html</link><dc:creator>花之剑</dc:creator><author>花之剑</author><pubDate>Sat, 04 Aug 2007 01:50:00 GMT</pubDate><guid>http://www.blogjava.net/lantin/articles/134372.html</guid><wfw:comment>http://www.blogjava.net/lantin/comments/134372.html</wfw:comment><comments>http://www.blogjava.net/lantin/articles/134372.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lantin/comments/commentRss/134372.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lantin/services/trackbacks/134372.html</trackback:ping><description><![CDATA[&nbsp;fgets(array,100,stdin);。
<img src ="http://www.blogjava.net/lantin/aggbug/134372.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lantin/" target="_blank">花之剑</a> 2007-08-04 09:50 <a href="http://www.blogjava.net/lantin/articles/134372.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>链表归并</title><link>http://www.blogjava.net/lantin/articles/133844.html</link><dc:creator>花之剑</dc:creator><author>花之剑</author><pubDate>Wed, 01 Aug 2007 10:02:00 GMT</pubDate><guid>http://www.blogjava.net/lantin/articles/133844.html</guid><wfw:comment>http://www.blogjava.net/lantin/comments/133844.html</wfw:comment><comments>http://www.blogjava.net/lantin/articles/133844.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lantin/comments/commentRss/133844.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lantin/services/trackbacks/133844.html</trackback:ping><description><![CDATA[<p>#include&lt;stdio.h&gt;<br>#include&lt;stdlib.h&gt;<br>typedef struct LNode<br>{<br>&nbsp;int data;<br>&nbsp;struct LNode *next;<br>}LNode,*Link;</p>
<p><br>Link&nbsp; InitalLink(Link L)<br>{<br>//&nbsp;printf("hello\n");<br>&nbsp;L=(Link) malloc(sizeof(LNode));<br>&nbsp;if(!L) printf("error"); <br>&nbsp;L-&gt;next=NULL;<br>&nbsp;return L;<br>}</p>
<p>Link createLink(Link L,int N)<br>{<br>&nbsp;//printf("%d",N);<br>&nbsp;Link p=L;<br>&nbsp;while(N&gt;0)<br>&nbsp;{<br>&nbsp;&nbsp; // printf("%d",N);<br>&nbsp;&nbsp;&nbsp;&nbsp; Link t=malloc(sizeof(LNode));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf("%d",&amp;t-&gt;data);<br>&nbsp;&nbsp;&nbsp;&nbsp; t-&gt;next=NULL;<br>&nbsp;&nbsp;&nbsp;&nbsp; L-&gt;next=t;<br>&nbsp;&nbsp;&nbsp;&nbsp; L=L-&gt;next;<br>&nbsp;&nbsp;&nbsp;&nbsp; //t-&gt;next=L-&gt;next;<br>&nbsp;&nbsp;&nbsp;&nbsp; //L-&gt;next=t;<br>&nbsp;&nbsp;&nbsp;&nbsp; N--;<br>&nbsp;}<br>&nbsp;return p;<br>}</p>
<p><br>&nbsp;</p>
<p>int main(int argc,char **argv)<br>{<br>&nbsp;printf("please input pa\n");<br>&nbsp;int num1,num2;<br>&nbsp;scanf("%d,%d",&amp;num1,&amp;num2);<br>&nbsp;Link L1,L2;<br>&nbsp;L1=InitalLink(L1);<br>&nbsp;L2=InitalLink(L2);<br>&nbsp;L1=createLink(L1,num1);<br>&nbsp;L2=createLink(L2,num2);<br>&nbsp;Link L3,L4;<br>&nbsp;L3=InitalLink(L3);<br>&nbsp;L4=L3;<br>&nbsp;L1=L1-&gt;next;L2=L2-&gt;next;<br>&nbsp;while(L1&amp;&amp;L2)<br>&nbsp;{<br>&nbsp;&nbsp; if(L1-&gt;data&lt;L2-&gt;data)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;L3-&gt;next=L1;L1=L1-&gt;next;L3=L3-&gt;next;<br>&nbsp;&nbsp;&nbsp; }else<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;L3-&gt;next=L2;L2=L2-&gt;next;L3=L3-&gt;next;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; L3-&gt;next=L1?L1:L2;<br>&nbsp;&nbsp; &nbsp;while(L4=L4-&gt;next)<br>&nbsp;{<br>&nbsp;&nbsp;printf("%d",L4-&gt;data);<br>&nbsp;&nbsp;<br>&nbsp;}<br>&nbsp;return 0;</p>
<p>}<br></p>
<img src ="http://www.blogjava.net/lantin/aggbug/133844.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lantin/" target="_blank">花之剑</a> 2007-08-01 18:02 <a href="http://www.blogjava.net/lantin/articles/133844.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C中字符串转换函数</title><link>http://www.blogjava.net/lantin/articles/118878.html</link><dc:creator>花之剑</dc:creator><author>花之剑</author><pubDate>Mon, 21 May 2007 06:50:00 GMT</pubDate><guid>http://www.blogjava.net/lantin/articles/118878.html</guid><wfw:comment>http://www.blogjava.net/lantin/comments/118878.html</wfw:comment><comments>http://www.blogjava.net/lantin/articles/118878.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/lantin/comments/commentRss/118878.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lantin/services/trackbacks/118878.html</trackback:ping><description><![CDATA[<span style="FONT-FAMILY: Comic Sans MS">1.atoi(const char *nptr)<br>将字符串转换为整数</span><br>char *p="123456";<br>int a=atoi(p);<br><span style="FONT-FAMILY: Comic Sans MS">2.atol(const char *nptr)<br>将字符串转换为长整数<br></span>char *p="123456";<br>long&nbsp;a=atol(p);<br><span style="FONT-FAMILY: Comic Sans MS">3.atof(const char *nptr)<br>将字符串转为浮点型</span>
<img src ="http://www.blogjava.net/lantin/aggbug/118878.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lantin/" target="_blank">花之剑</a> 2007-05-21 14:50 <a href="http://www.blogjava.net/lantin/articles/118878.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C中strlen和sizeof的区别</title><link>http://www.blogjava.net/lantin/articles/118462.html</link><dc:creator>花之剑</dc:creator><author>花之剑</author><pubDate>Fri, 18 May 2007 14:13:00 GMT</pubDate><guid>http://www.blogjava.net/lantin/articles/118462.html</guid><wfw:comment>http://www.blogjava.net/lantin/comments/118462.html</wfw:comment><comments>http://www.blogjava.net/lantin/articles/118462.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lantin/comments/commentRss/118462.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lantin/services/trackbacks/118462.html</trackback:ping><description><![CDATA[对于如下代码.可得出简单的结论<br>#include&lt;stdio.h&gt;<br>#include&lt;string.h&gt;<br>int main<br>{<br>&nbsp;&nbsp;&nbsp;char&nbsp;str[]="hello";<br>&nbsp;&nbsp;&nbsp;printf("%d\n",sizeof(str));<br>&nbsp;&nbsp;&nbsp;printf("%d\n",strlen(str));<br>&nbsp;&nbsp;&nbsp;return 0;<br>}<br><br>Result<br>6<br>5<br>为什么会出现这结果呢<br>是因为sizeof将字符串的'\0'算进去了<br>而strlen只是算显示的字符个数..
<img src ="http://www.blogjava.net/lantin/aggbug/118462.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lantin/" target="_blank">花之剑</a> 2007-05-18 22:13 <a href="http://www.blogjava.net/lantin/articles/118462.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>原创:用C写的小型网页分词程序 </title><link>http://www.blogjava.net/lantin/articles/117073.html</link><dc:creator>花之剑</dc:creator><author>花之剑</author><pubDate>Sat, 12 May 2007 16:10:00 GMT</pubDate><guid>http://www.blogjava.net/lantin/articles/117073.html</guid><wfw:comment>http://www.blogjava.net/lantin/comments/117073.html</wfw:comment><comments>http://www.blogjava.net/lantin/articles/117073.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lantin/comments/commentRss/117073.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lantin/services/trackbacks/117073.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;用C写的小型电子商务购物搜索引擎网页分词程序&nbsp;&nbsp; 网页的抓取是用Larbin实现的如图&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ''~``&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n...&nbsp;&nbsp;<a href='http://www.blogjava.net/lantin/articles/117073.html'>阅读全文</a><img src ="http://www.blogjava.net/lantin/aggbug/117073.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lantin/" target="_blank">花之剑</a> 2007-05-13 00:10 <a href="http://www.blogjava.net/lantin/articles/117073.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>合并排序(merge) 算法时间复杂度O(nlgn)</title><link>http://www.blogjava.net/lantin/articles/117067.html</link><dc:creator>花之剑</dc:creator><author>花之剑</author><pubDate>Sat, 12 May 2007 15:49:00 GMT</pubDate><guid>http://www.blogjava.net/lantin/articles/117067.html</guid><wfw:comment>http://www.blogjava.net/lantin/comments/117067.html</wfw:comment><comments>http://www.blogjava.net/lantin/articles/117067.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lantin/comments/commentRss/117067.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lantin/services/trackbacks/117067.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;1#include&lt;iostream&gt;&nbsp;&nbsp;2#include&lt;stdlib.h&gt;&nbsp;&nbsp;3#include&lt;time.h&gt;&nbsp;&nbsp;4const&nbsp;int&nbsp;N&nbsp;=&nbsp;8;&nbsp;&nbsp;5/**//////////&nbsp;&nbsp;6///...&nbsp;&nbsp;<a href='http://www.blogjava.net/lantin/articles/117067.html'>阅读全文</a><img src ="http://www.blogjava.net/lantin/aggbug/117067.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lantin/" target="_blank">花之剑</a> 2007-05-12 23:49 <a href="http://www.blogjava.net/lantin/articles/117067.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>插入排序算法(Insertation Algotithm) 时间复杂度O(n^2)</title><link>http://www.blogjava.net/lantin/articles/117066.html</link><dc:creator>花之剑</dc:creator><author>花之剑</author><pubDate>Sat, 12 May 2007 15:41:00 GMT</pubDate><guid>http://www.blogjava.net/lantin/articles/117066.html</guid><wfw:comment>http://www.blogjava.net/lantin/comments/117066.html</wfw:comment><comments>http://www.blogjava.net/lantin/articles/117066.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lantin/comments/commentRss/117066.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lantin/services/trackbacks/117066.html</trackback:ping><description><![CDATA[<div>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>Email:lantin_fang@</span><span style="COLOR: #000000">163</span><span style="COLOR: #000000">.com<br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>Author:Lantin<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>#include</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>#include</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;&nbsp;main()<br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img id=Codehighlighter1_94_531_Open_Image onclick="this.style.display='none'; Codehighlighter1_94_531_Open_Text.style.display='none'; Codehighlighter1_94_531_Closed_Image.style.display='inline'; Codehighlighter1_94_531_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_94_531_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_94_531_Closed_Text.style.display='none'; Codehighlighter1_94_531_Open_Image.style.display='inline'; Codehighlighter1_94_531_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_94_531_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_94_531_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;N</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img id=Codehighlighter1_137_163_Open_Image onclick="this.style.display='none'; Codehighlighter1_137_163_Open_Text.style.display='none'; Codehighlighter1_137_163_Closed_Image.style.display='inline'; Codehighlighter1_137_163_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_137_163_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_137_163_Closed_Text.style.display='none'; Codehighlighter1_137_163_Open_Image.style.display='inline'; Codehighlighter1_137_163_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;a[N]</span><span style="COLOR: #000000">=</span><span id=Codehighlighter1_137_163_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id=Codehighlighter1_137_163_Open_Text><span style="COLOR: #000000">{</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">85</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">564</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">7</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">7891</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">9</span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img id=Codehighlighter1_204_431_Open_Image onclick="this.style.display='none'; Codehighlighter1_204_431_Open_Text.style.display='none'; Codehighlighter1_204_431_Closed_Image.style.display='inline'; Codehighlighter1_204_431_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_204_431_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_204_431_Closed_Text.style.display='none'; Codehighlighter1_204_431_Open_Image.style.display='inline'; Codehighlighter1_204_431_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_204_431_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id=Codehighlighter1_204_431_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;j</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">i</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;key</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">a[i];<br></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(j</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;a[j]</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">key)<br></span><span style="COLOR: #008080">20</span><span style="COLOR: #000000"><img id=Codehighlighter1_317_393_Open_Image onclick="this.style.display='none'; Codehighlighter1_317_393_Open_Text.style.display='none'; Codehighlighter1_317_393_Closed_Image.style.display='inline'; Codehighlighter1_317_393_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_317_393_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_317_393_Closed_Text.style.display='none'; Codehighlighter1_317_393_Open_Image.style.display='inline'; Codehighlighter1_317_393_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_317_393_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id=Codehighlighter1_317_393_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">21</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a[j</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">a[j];<br></span><span style="COLOR: #008080">22</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">23</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">24</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a[j</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">key;<br></span><span style="COLOR: #008080">25</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">26</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">27</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">a[i]</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">std::endl;<br></span><span style="COLOR: #008080">28</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">29</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
</div>
<img src ="http://www.blogjava.net/lantin/aggbug/117066.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lantin/" target="_blank">花之剑</a> 2007-05-12 23:41 <a href="http://www.blogjava.net/lantin/articles/117066.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>