﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-CrazyNerd 's Blog</title><link>http://www.cppblog.com/GUO/</link><description>嵌入式软件、网络、安全、多媒体</description><language>zh-cn</language><lastBuildDate>Thu, 09 Apr 2026 06:49:49 GMT</lastBuildDate><pubDate>Thu, 09 Apr 2026 06:49:49 GMT</pubDate><ttl>60</ttl><item><title>字符串反回首字母大写</title><link>http://www.cppblog.com/GUO/archive/2010/09/13/126528.html</link><dc:creator>CrazyNerd</dc:creator><author>CrazyNerd</author><pubDate>Mon, 13 Sep 2010 13:26:00 GMT</pubDate><guid>http://www.cppblog.com/GUO/archive/2010/09/13/126528.html</guid><wfw:comment>http://www.cppblog.com/GUO/comments/126528.html</wfw:comment><comments>http://www.cppblog.com/GUO/archive/2010/09/13/126528.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/GUO/comments/commentRss/126528.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/GUO/services/trackbacks/126528.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#include</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdio.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdlib.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main()<br>{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;flag&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">用flag来判断是不是一个新的单词</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;a[</span><span style="color: #000000;">100</span><span style="color: #000000;">];<br>&nbsp;&nbsp;&nbsp;&nbsp;gets(a);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;a[i]&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(a[i]&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">((flag&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">(a[i]</span><span style="color: #000000;">&gt;=</span><span style="color: #000000;">97</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">a[i]</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">122</span><span style="color: #000000;">))&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">a&nbsp;&lt;--&gt;&nbsp;z</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a[i]</span><span style="color: #000000;">=</span><span style="color: #000000;">a[i]</span><span style="color: #000000;">-</span><span style="color: #000000;">32</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">转换为A&nbsp;&lt;--&gt;&nbsp;Z&nbsp;的ASCII值&nbsp;</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;puts(a);&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;system(</span><span style="color: #000000;">"</span><span style="color: #000000;">PAUSE</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&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>}<br></span></div>
<br>运行结果：<br><img  src="http://www.cppblog.com/images/cppblog_com/guo/change.jpg" border="0"><br><br>附<br>1.ASCII表：<br><img src="http://www.cppblog.com/images/cppblog_com/guo/asciifull.gif" border="0"><br><br>2.扩展：<br><img src="http://www.cppblog.com/images/cppblog_com/guo/extend.gif" border="0"><br><br> <img src ="http://www.cppblog.com/GUO/aggbug/126528.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/GUO/" target="_blank">CrazyNerd</a> 2010-09-13 21:26 <a href="http://www.cppblog.com/GUO/archive/2010/09/13/126528.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]C库函数中字符串处理函数集合</title><link>http://www.cppblog.com/GUO/archive/2010/09/13/126522.html</link><dc:creator>CrazyNerd</dc:creator><author>CrazyNerd</author><pubDate>Mon, 13 Sep 2010 11:46:00 GMT</pubDate><guid>http://www.cppblog.com/GUO/archive/2010/09/13/126522.html</guid><wfw:comment>http://www.cppblog.com/GUO/comments/126522.html</wfw:comment><comments>http://www.cppblog.com/GUO/archive/2010/09/13/126522.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/GUO/comments/commentRss/126522.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/GUO/services/trackbacks/126522.html</trackback:ping><description><![CDATA[原文：<a style="color: #ff0000;" target="_blank"  href="http://blog.csdn.net/General1982/archive/2009/03/21/4012566.aspx">http://blog.csdn.net/General1982/archive/2009/03/21/4012566.aspx
</a><br><br>
<div>
<p>bcmp</p>
<p>原型：extern int bcmp(const void *s1, const void *s2, int n);<br>用法：#include &lt;string.h&gt;<br>功能：比较字符串s1和s2的前n个字节是否相等<br>说明：如果s1=s2或n=0则返回零，否则返回非零值。bcmp不检查NULL。</p>
<p>bcopy&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>原型：extern void bcopy(const void *src, void *dest, int n);<br>用法：#include &lt;string.h&gt;<br>&nbsp;&nbsp; 功能：将字符串src的前n个字节复制到dest中<br>&nbsp;&nbsp; 说明：bcopy不检查字符串中的空字节NULL，函数没有返回值。</p>
<p>bzero</p>
<p>&nbsp;&nbsp; 原型：extern void bzero(void *s, int n);<br>&nbsp;&nbsp; 用法：#include &lt;string.h&gt;<br>&nbsp;&nbsp; 功能：置字节字符串s的前n个字节为零。<br>&nbsp;&nbsp; 说明：bzero无返回值。</p>
<p>memccpy&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp; 原型：extern void *memccpy(void *dest, void *src, unsigned char ch, unsigned int count);<br>&nbsp;&nbsp; 用法：#include &lt;string.h&gt;<br>&nbsp;&nbsp; 功能：由src所指内存区域复制不多于count个字节到dest所指内存区域，如果遇到字符ch则停止复制。<br>&nbsp;&nbsp; 说明：返回指向字符ch后的第一个字符的指针，如果src前n个字节中不存在ch则返回NULL。ch被复制。<br>&nbsp;&nbsp;<br>memchr&nbsp;&nbsp;<br><br>&nbsp;&nbsp; 原型：extern void *memchr(void *buf, char ch, unsigned count);<br>&nbsp;&nbsp; 用法：#include &lt;string.h&gt;<br>&nbsp;&nbsp; 功能：从buf所指内存区域的前count个字节查找字符ch。 <br>&nbsp;&nbsp; 说明：当第一次遇到字符ch时停止查找。如果成功，返回指向字符ch的指针；否则返回NULL。</p>
<p>memcmp</p>
<p>&nbsp;&nbsp; 原型：extern int memcmp(void *buf1, void *buf2, unsigned int count);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; 用法：#include &lt;string.h&gt;<br>&nbsp;&nbsp; 功能：比较内存区域buf1和buf2的前count个字节。 <br>&nbsp;&nbsp; 说明：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当buf1&lt;buf2时，返回值&lt;0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当buf1=buf2时，返回值=0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当buf1&gt;buf2时，返回值&gt;0</p>
<p>memcpy</p>
<p>&nbsp;&nbsp; 原型：extern void *memcpy(void *dest, void *src, unsigned int count);<br>用法：#include &lt;string.h&gt;<br>&nbsp;&nbsp; 功能：由src所指内存区域复制count个字节到dest所指内存区域。<br>&nbsp;&nbsp; 说明：src和dest所指内存区域不能重叠，函数返回指向dest的指针。</p>
<p>memicmp <br>&nbsp;&nbsp;<br>&nbsp;&nbsp; 原型：extern int memicmp(void *buf1, void *buf2, unsigned int count);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; 用法：#include &lt;string.h&gt;<br>&nbsp;&nbsp; 功能：比较内存区域buf1和buf2的前count个字节但不区分字母的大小写。<br>&nbsp;&nbsp; 说明：memicmp同memcmp的唯一区别是memicmp不区分大小写字母。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当buf1&lt;buf2时，返回值&lt;0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当buf1=buf2时，返回值=0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当buf1&gt;buf2时，返回值&gt;0<br><br>memmove <br>&nbsp;&nbsp;<br>&nbsp;&nbsp; 原型：extern void *memmove(void *dest, const void *src, unsigned int count);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; 用法：#include &lt;string.h&gt;<br>&nbsp;&nbsp; 功能：由src所指内存区域复制count个字节到dest所指内存区域。<br>&nbsp;&nbsp; 说明：src和dest所指内存区域可以重叠，但复制后src内容会被更改。函数返回指向dest的指针。</p>
<p>memset</p>
<p>&nbsp;&nbsp; 原型：extern void *memset(void *buffer, int c, int count);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; 用法：#include &lt;string.h&gt;<br>&nbsp;&nbsp; 功能：把buffer所指内存区域的前count个字节设置成字符c。<br>&nbsp;&nbsp; 说明：返回指向buffer的指针。</p>
<p>movmem&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp; 原型：extern void movmem(void *src, void *dest, unsigned int count);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; 用法：#include &lt;string.h&gt;<br>&nbsp;&nbsp; 功能：由src所指内存区域复制count个字节到dest所指内存区域。<br>&nbsp;&nbsp; 说明：src和dest所指内存区域可以重叠，但复制后src内容会被更改。函数返回指向dest的指针。<br><br>setmem</p>
<p>&nbsp;&nbsp; 原型：extern void setmem(void *buf, unsigned int count, char ch);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; 用法：#include &lt;string.h&gt;<br>&nbsp;&nbsp; 功能：把buf所指内存区域前count个字节设置成字符ch。<br>&nbsp;&nbsp; 说明：返回指向buf的指针。</p>
<p>stpcpy <br>&nbsp;&nbsp;<br>&nbsp;&nbsp; 原型：extern char *stpcpy(char *dest,char *src);&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; 用法：#include &lt;string.h&gt;<br>&nbsp;&nbsp; 功能：把src所指由NULL结束的字符串复制到dest所指的数组中。<br>&nbsp;&nbsp; 说明：src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回指向dest结尾处字符(NULL)的指针。</p>
<p>strcat</p>
<p>&nbsp;&nbsp; 原型：extern char *strcat(char *dest,char *src);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; 用法：#include &lt;string.h&gt;<br>&nbsp;&nbsp; 功能：把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0'。<br>&nbsp;&nbsp; 说明：src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回指向dest的指针。</p>
<p>strchr&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp; 原型：extern char *strchr(char *s,char c);&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; 用法：#include &lt;string.h&gt; <br>&nbsp;&nbsp; 功能：查找字符串s中首次出现字符c的位置<br>&nbsp;&nbsp; 说明：返回首次出现c的位置的指针，如果s中不存在c则返回NULL。<br>&nbsp;&nbsp;<br>strcmp <br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; 原型：extern int strcmp(char *s1,char * s2);&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; 用法：#include &lt;string.h&gt;<br>&nbsp;&nbsp; 功能：比较字符串s1和s2。<br>&nbsp;&nbsp; 说明：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当s1&lt;s2时，返回值&lt;0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当s1=s2时，返回值=0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当s1&gt;s2时，返回值&gt;0</p>
<p>stricmp,strcmpi&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp; 原型：extern int stricmp(char *s1,char * s2);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; 用法：#include &lt;string.h&gt;<br>&nbsp;&nbsp; 功能：比较字符串s1和s2，但不区分字母的大小写。<br>&nbsp;&nbsp; 说明：strcmpi是到stricmp的宏定义，实际未提供此函数。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当s1&lt;s2时，返回值&lt;0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当s1=s2时，返回值=0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当s1&gt;s2时，返回值&gt;0</p>
<p>strcpy <br>&nbsp;&nbsp;<br>&nbsp;&nbsp; 原型：extern char *strcpy(char *dest,char *src);&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; 用法：#include &lt;string.h&gt;<br>&nbsp;&nbsp; 功能：把src所指由NULL结束的字符串复制到dest所指的数组中。 <br>&nbsp;&nbsp; 说明：src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回指向dest的指针。</p>
<p>strcspn</p>
<p>&nbsp;&nbsp; 原型：extern int strcspn(char *s1,char *s2);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; 用法：#include &lt;string.h&gt;<br>&nbsp;&nbsp; 功能：在字符串s1中搜寻s2中所出现的字符。<br>&nbsp;&nbsp; 说明：返回第一个出现的字符在s1中的下标值，亦即在s1中出现而s2中没有出现的子串的长度。</p>
<p>strdup <br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; 原型：extern char *strdup(char *s);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; 用法：#include &lt;string.h&gt;<br>&nbsp;&nbsp; 功能：复制字符串s<br>&nbsp;&nbsp; 说明：返回指向被复制的字符串的指针，所需空间由malloc()分配且可以由free()释放。<br><br>strlen <br>&nbsp;&nbsp;<br>&nbsp;&nbsp; 原型：extern int strlen(char *s);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; 用法：#include &lt;string.h&gt;<br>&nbsp;&nbsp; 功能：计算字符串s的长度<br>&nbsp;&nbsp; 说明：返回s的长度，不包括结束符NULL。</p>
<p>strlwr</p>
<p>&nbsp;&nbsp; 原型：extern char *strlwr(char *s);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; 用法：#include &lt;string.h&gt;<br>&nbsp;&nbsp; 功能：将字符串s转换为小写形式<br>&nbsp;&nbsp; 说明：只转换s中出现的大写字母，不改变其它字符。返回指向s的指针。</p>
<p><br>strncat</p>
<p>&nbsp;&nbsp; 原型：extern char *strncat(char *dest,char *src,int n);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; 用法：#include &lt;string.h&gt;<br>&nbsp;&nbsp; 功能：把src所指字符串的前n个字符添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0'。<br>&nbsp;&nbsp; 说明：src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回指向dest的指针。</p>
<p>strncmp</p>
<p>&nbsp;&nbsp; 原型：extern int strcmp(char *s1,char * s2，int n);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; 用法：#include &lt;string.h&gt;<br>&nbsp;&nbsp; 功能：比较字符串s1和s2的前n个字符。<br>&nbsp;&nbsp; 说明：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当s1&lt;s2时，返回值&lt;0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当s1=s2时，返回值=0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当s1&gt;s2时，返回值&gt;0</p>
<p>strnicmp,strncmpi</p>
<p>&nbsp;&nbsp; 原型：extern int strnicmp(char *s1,char * s2，int n);&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; 用法：#include &lt;string.h&gt; <br>&nbsp;&nbsp; 功能：比较字符串s1和s2的前n个字符但不区分大小写。<br>&nbsp;&nbsp; 说明：strncmpi是到strnicmp的宏定义<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当s1&lt;s2时，返回值&lt;0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当s1=s2时，返回值=0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当s1&gt;s2时，返回值&gt;0</p>
<p>strncpy <br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; 原型：extern char *strncpy(char *dest, char *src, int n);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; 用法：#include &lt;string.h&gt;<br>&nbsp;&nbsp; 功能：把src所指由NULL结束的字符串的前n个字节复制到dest所指的数组中。<br>&nbsp;&nbsp; 说明：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果src的前n个字节不含NULL字符，则结果不会以NULL字符结束。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果src的长度小于n个字节，则以NULL填充dest直到复制完n个字节。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回指向dest的指针。</p>
<p>strpbrk</p>
<p>&nbsp;&nbsp; 原型：extern char *strpbrk(char *s1, char *s2);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; 用法：#include &lt;string.h&gt;&nbsp;&nbsp;<br>&nbsp;&nbsp; 功能：在字符串s1中寻找字符串s2中任何一个字符相匹配的第一个字符的位置，空字符NULL不包括在内。&nbsp;&nbsp;<br>&nbsp;&nbsp; 说明：返回指向s1中第一个相匹配的字符的指针，如果没有匹配字符则返回空指针NULL。</p>
<p>strrev <br>&nbsp;&nbsp;<br>&nbsp;&nbsp; 原型：extern char *strrev(char *s);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; 用法：#include &lt;string.h&gt; <br>&nbsp;&nbsp; 功能：把字符串s的所有字符的顺序颠倒过来（不包括空字符NULL）。<br>&nbsp;&nbsp; 说明：返回指向颠倒顺序后的字符串指针。</p>
<p>strset</p>
<p>&nbsp;&nbsp; 原型：extern char *strset(char *s, char c);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; 用法：#include &lt;string.h&gt;<br>&nbsp;&nbsp; 功能：把字符串s中的所有字符都设置成字符c。<br>&nbsp;&nbsp; 说明：返回指向s的指针。</p>
<p>strstr</p>
<p>&nbsp;&nbsp; 原型：extern char *strstr(char *haystack, char *needle);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; 用法：#include &lt;string.h&gt;<br>&nbsp;&nbsp; 功能：从字符串haystack中寻找needle第一次出现的位置（不比较结束符NULL)。<br>&nbsp;&nbsp; 说明：返回指向第一次出现needle位置的指针，如果没找到则返回NULL。<br><br>strtok</p>
<p>&nbsp;&nbsp; 原型：extern char *strtok(char *s, char *delim);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; 用法：#include &lt;string.h&gt;<br>&nbsp;&nbsp; 功能：分解字符串为一组标记串。s为要分解的字符串，delim为分隔符字符串。<br>&nbsp;&nbsp; 说明：首次调用时，s必须指向要分解的字符串，随后调用要把s设成NULL。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strtok在s中查找包含在delim中的字符并用NULL('\0')来替换，直到找遍整个字符串。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回指向下一个标记串。当没有标记串时则返回空字符NULL。</p>
<p>strupr</p>
<p>&nbsp;&nbsp; 原型：extern char *strupr(char *s);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; 用法：#include &lt;string.h&gt;<br>&nbsp;&nbsp; 功能：将字符串s转换为大写形式<br>&nbsp;&nbsp; 说明：只转换s中出现的小写字母，不改变其它字符。返回指向s的指针。</p>
</div>
<br><br><img src ="http://www.cppblog.com/GUO/aggbug/126522.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/GUO/" target="_blank">CrazyNerd</a> 2010-09-13 19:46 <a href="http://www.cppblog.com/GUO/archive/2010/09/13/126522.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>字符串循环移位问题</title><link>http://www.cppblog.com/GUO/archive/2010/09/13/126521.html</link><dc:creator>CrazyNerd</dc:creator><author>CrazyNerd</author><pubDate>Mon, 13 Sep 2010 11:40:00 GMT</pubDate><guid>http://www.cppblog.com/GUO/archive/2010/09/13/126521.html</guid><wfw:comment>http://www.cppblog.com/GUO/comments/126521.html</wfw:comment><comments>http://www.cppblog.com/GUO/archive/2010/09/13/126521.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/GUO/comments/commentRss/126521.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/GUO/services/trackbacks/126521.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdlib.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdio.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><br>//向右循环移位<br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;loopmover&nbsp;(&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;pstr,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;steps&nbsp;)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;strlen(pstr)&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;steps;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">buff</span><span style="color: #000000;">=</span><span style="color: #000000;">(</span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">)malloc(strlen(pstr)</span><span style="color: #000000;">+</span><span style="color: #000000;">1</span><span style="color: #000000;">);&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;strcpy(buff,pstr</span><span style="color: #000000;">+</span><span style="color: #000000;">n);<br>&nbsp;&nbsp;&nbsp;&nbsp;strncat(buff,pstr,n);<br>&nbsp;&nbsp;&nbsp;&nbsp;buff[strlen(pstr)]</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>&nbsp;&nbsp;&nbsp;&nbsp;strcpy(pstr,buff);&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;free(buff);<br>}<br><br>//向左循环移位
<br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;loopmovel&nbsp;(&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;pstr,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;steps&nbsp;)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">buff</span><span style="color: #000000;">=</span><span style="color: #000000;">(</span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">)malloc(strlen(pstr)</span><span style="color: #000000;">+</span><span style="color: #000000;">1</span><span style="color: #000000;">);&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;strcpy(buff,pstr</span><span style="color: #000000;">+</span><span style="color: #000000;">steps);<br>&nbsp;&nbsp;&nbsp;&nbsp;strncat(buff,pstr,steps);<br>&nbsp;&nbsp;&nbsp;&nbsp;buff[strlen(pstr)]</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>&nbsp;&nbsp;&nbsp;&nbsp;strcpy(pstr,&nbsp;buff);&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;free(buff);<br>}<br><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main&nbsp;()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;a[]</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">abcdefg123456</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">%s\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,a);<br>&nbsp;&nbsp;&nbsp;&nbsp;loopmover(a,</span><span style="color: #000000;">5</span><span style="color: #000000;">);//右移5位<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">%s\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,a);<br>&nbsp;&nbsp;&nbsp;&nbsp;loopmovel(a,</span><span style="color: #000000;">5</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">%s\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,a);<br>&nbsp;&nbsp;&nbsp;&nbsp;system(</span><span style="color: #000000;">"</span><span style="color: #000000;">PAUSE</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&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>}<br></span></div>
<br>运行结果：<br><img src="http://www.cppblog.com/images/cppblog_com/guo/move.jpg" border="0"><br><br>
<h4 class="TextColor1" style="margin-bottom: 0px; font-weight: normal;">C库函数中字符串处理函数集合：</h4>
<a style="color: #ff0000;" target="_blank"  href="http://www.cppblog.com/GUO/archive/2010/09/13/126522.html">http://www.cppblog.com/GUO/archive/2010/09/13/126522.html
</a><br>  <img src ="http://www.cppblog.com/GUO/aggbug/126521.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/GUO/" target="_blank">CrazyNerd</a> 2010-09-13 19:40 <a href="http://www.cppblog.com/GUO/archive/2010/09/13/126521.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]单链表反转问题</title><link>http://www.cppblog.com/GUO/archive/2010/09/12/126487.html</link><dc:creator>CrazyNerd</dc:creator><author>CrazyNerd</author><pubDate>Sun, 12 Sep 2010 15:57:00 GMT</pubDate><guid>http://www.cppblog.com/GUO/archive/2010/09/12/126487.html</guid><wfw:comment>http://www.cppblog.com/GUO/comments/126487.html</wfw:comment><comments>http://www.cppblog.com/GUO/archive/2010/09/12/126487.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/GUO/comments/commentRss/126487.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/GUO/services/trackbacks/126487.html</trackback:ping><description><![CDATA[原文：<a style="color: #ff0000;" target="_blank" href="http://nkshili.spaces.live.com/blog/cns%21BB418D20B454CBE7%211489.entry">http://nkshili.spaces.live.com/blog/cns!BB418D20B454CBE7!1489.entry
</a><br><br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">/*<br>两种方法，一种是直接把每个位置都倒转，最后头节点指向本来是尾巴的节点，另一个是每次拿到一个节点都插入到头节点后。<br>*/<br></span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdio.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdlib.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><br></span>//结点类型定义 <br>typedef struct Node<br>{<br>&nbsp;&nbsp;&nbsp; int number;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //数据域 <br>&nbsp;&nbsp;&nbsp; struct Node *next; //指针域 <br>}*PtrNode
<span style="color: #000000;"><br><br>//第一个方法：<br><br>void&nbsp;reverse_link_1(PtrNode&nbsp;link)<br>{<br>
<div style="margin-left: 40px;">PtrNode&nbsp;first,second,ptr;<br>if(link-&gt;next==NULL)<br>{<br>
<div style="margin-left: 40px;">return;<br></div>
}<br>ptr=link-&gt;next;<br>first=ptr-&gt;next;<br>ptr-&gt;next=NULL;<br>while(ptr!=NULL)<br>{<br>
<div style="margin-left: 40px;">if(first==NULL)<br>{<br>
<div style="margin-left: 40px;">link-&gt;next=ptr;<br>break;<br></div>
}<br>else<br>{<br>
<div style="margin-left: 40px;">second=first-&gt;next;<br>first-&gt;next=ptr;<br>ptr=first;<br>first=second;<br></div>
}<br></div>
}<br></div>
}<br><br>//第二个方法：<br><br>void&nbsp;reverse_link_2(PtrNode&nbsp;link)<br>{<br>
<div style="margin-left: 40px;">PtrNode&nbsp;ptr,temp;<br>if(link-&gt;next==NULL)<br>{<br>
<div style="margin-left: 40px;">return;<br></div>
}<br>ptr=link-&gt;next;<br>while(ptr-&gt;next!=NULL)<br>{<br>
<div style="margin-left: 40px;">temp=ptr-&gt;next;<br>ptr-&gt;next=ptr-&gt;next-&gt;next;<br>temp-&gt;next=link-&gt;next;<br>link-&gt;next=temp;<br></div>
}<br></div>
}
<br><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;fill_link(PtrNode&nbsp;link)<br>{<br></span>
<div style="margin-left: 40px;"><span style="color: #000000;">PtrNode&nbsp;ptr,temp;</span><br><span style="color: #000000;"></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i;</span><br><span style="color: #000000;">ptr</span><span style="color: #000000;">=</span><span style="color: #000000;">link;</span><br><span style="color: #000000;"></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;">&lt;</span><span style="color: #000000;">10</span><span style="color: #000000;">;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)</span><br><span style="color: #000000;">{</span><br>
<div style="margin-left: 40px;"><span style="color: #000000;">temp</span><span style="color: #000000;">=</span><span style="color: #000000;">(PtrNode)malloc(</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;Node));</span><br><span style="color: #000000;">temp</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">number</span><span style="color: #000000;">=</span><span style="color: #000000;">i;</span><br><span style="color: #000000;">temp</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">next</span><span style="color: #000000;">=</span><span style="color: #000000;">NULL;</span><br><span style="color: #000000;">ptr</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">next</span><span style="color: #000000;">=</span><span style="color: #000000;">temp;</span><br><span style="color: #000000;">ptr</span><span style="color: #000000;">=</span><span style="color: #000000;">ptr</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">next;</span><br></div>
<span style="color: #000000;">}</span><br><span style="color: #000000;"></span></div>
<span style="color: #000000;">}<br><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;print_link(PtrNode&nbsp;link)<br>{<br></span>
<div style="margin-left: 40px;"><span style="color: #000000;">PtrNode&nbsp;ptr</span><span style="color: #000000;">=</span><span style="color: #000000;">link</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">next;</span><br><span style="color: #000000;">printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">Link:\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);</span><br><span style="color: #000000;"></span><span style="color: #0000ff;">while</span><span style="color: #000000;">(ptr</span><span style="color: #000000;">!=</span><span style="color: #000000;">NULL)</span><br><span style="color: #000000;">{</span><br>
<div style="margin-left: 40px;"><span style="color: #000000;">printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">%d\t</span><span style="color: #000000;">"</span><span style="color: #000000;">,ptr</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">number);</span><br><span style="color: #000000;">ptr</span><span style="color: #000000;">=</span><span style="color: #000000;">ptr</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">next;</span><br></div>
<span style="color: #000000;">}</span><br><span style="color: #000000;">printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);</span><br><span style="color: #000000;"></span></div>
<span style="color: #000000;">}<br><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;free_link(PtrNode&nbsp;link)<br>{<br></span>
<div style="margin-left: 40px;"><span style="color: #000000;">PtrNode&nbsp;ptr</span><span style="color: #000000;">=</span><span style="color: #000000;">link;</span><br><span style="color: #000000;"></span><span style="color: #0000ff;">while</span><span style="color: #000000;">(ptr</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">next</span><span style="color: #000000;">!=</span><span style="color: #000000;">NULL)</span><br><span style="color: #000000;">{</span><br>
<div style="margin-left: 40px;"><span style="color: #000000;">PtrNode&nbsp;temp</span><span style="color: #000000;">=</span><span style="color: #000000;">ptr</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">next;</span><br><span style="color: #000000;">ptr</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">next</span><span style="color: #000000;">=</span><span style="color: #000000;">temp</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">next;</span><br><span style="color: #000000;">free(temp);</span><br></div>
<span style="color: #000000;">}</span><br><span style="color: #000000;"></span></div>
<span style="color: #000000;">}<br><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main()<br>{<br></span>
<div style="margin-left: 40px;"><span style="color: #000000;">PtrNode&nbsp;head;</span><br><span style="color: #000000;">head</span><span style="color: #000000;">=</span><span style="color: #000000;">(PtrNode)malloc(</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;Node));</span><br><span style="color: #000000;">head</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">next</span><span style="color: #000000;">=</span><span style="color: #000000;">NULL;</span><br><span style="color: #000000;">head</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">number</span><span style="color: #000000;">=-</span><span style="color: #000000;">1</span><span style="color: #000000;">;</span><br><span style="color: #000000;">fill_link(head);</span><br>
<div style="margin-left: 40px;"><span style="color: #000000;">print_link(head);</span><br></div>
<span style="color: #000000;">reverse_link_1(head);</span><br>
<div style="margin-left: 40px;"><span style="color: #000000;">print_link(head);</span><br></div>
<span style="color: #000000;">reverse_link_2(head);</span><br>
<div style="margin-left: 40px;"><span style="color: #000000;">print_link(head);</span><br></div>
<span style="color: #000000;">free_link(head);</span><br>
<div style="margin-left: 40px;"><span style="color: #000000;">print_link(head);</span><br></div>
<span style="color: #000000;">free(head);</span><br>system("PAUSE");<br><span style="color: #000000;"></span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;</span><br><span style="color: #000000;"></span></div>
<span style="color: #000000;">}<br>运行结果:<br></span></div>
<div style="text-align: left;"><img src="http://www.cppblog.com/images/cppblog_com/guo/reverse.jpg" border="0"><br>     </div><img src ="http://www.cppblog.com/GUO/aggbug/126487.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/GUO/" target="_blank">CrazyNerd</a> 2010-09-12 23:57 <a href="http://www.cppblog.com/GUO/archive/2010/09/12/126487.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>括号匹配问题(C++、堆栈)</title><link>http://www.cppblog.com/GUO/archive/2010/09/12/126483.html</link><dc:creator>CrazyNerd</dc:creator><author>CrazyNerd</author><pubDate>Sun, 12 Sep 2010 15:11:00 GMT</pubDate><guid>http://www.cppblog.com/GUO/archive/2010/09/12/126483.html</guid><wfw:comment>http://www.cppblog.com/GUO/comments/126483.html</wfw:comment><comments>http://www.cppblog.com/GUO/archive/2010/09/12/126483.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/GUO/comments/commentRss/126483.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/GUO/services/trackbacks/126483.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008000;">/*</span><span style="color: #008000;"><br>括号匹配问题，比较经典，利用堆栈来实现(摘自internet)<br><br>1.&nbsp;括号匹配的四种可能性：<br><br>①左右括号配对次序不正确<br>②右括号多于左括号<br>③左括号多于右括号<br>④左右括号匹配正确<br><br>2.&nbsp;算法思想：<br><br>顺序扫描算数表达式（表现为一个字符串），当遇到三种类型的左括号时候让该括号进栈；<br>当扫描到某一种类型的右括号时，比较当前栈顶元素是否与之匹配，若匹配，退栈继续判断；<br>若当前栈顶元素与当前扫描的括号不匹配，则左右括号配对次序不正确；<br>若字符串当前为某种类型的右括号而堆栈已经空，则右括号多于左括号；<br>字符串循环扫描结束时，若堆栈非空（即堆栈尚有某种类型的左括号），则说明左括号多于右括号；<br>否则，括号配对正确。<br><br>3.&nbsp;程序实现：<br></span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>#include&nbsp;</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: #0000ff;">using</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">namespace</span><span style="color: #000000;">&nbsp;std;<br><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;maxsize&nbsp;100</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;sStack<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;sign[maxsize];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;top;<br>};<br><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;InitsStack(sStack&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">SS)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SS.top</span><span style="color: #000000;">=-</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>}<br><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;IsEmptysStack(sStack&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">SS)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(SS.top</span><span style="color: #000000;">==-</span><span style="color: #000000;">1</span><span style="color: #000000;">)<br></span><span style="color: #0000ff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&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>}<br><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;PushsStack(sStack&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">SS,</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;c)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SS.sign[</span><span style="color: #000000;">++</span><span style="color: #000000;">SS.top]</span><span style="color: #000000;">=</span><span style="color: #000000;">c;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>}<br><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;UpsStack(sStack&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">SS)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(IsEmptysStack(SS))<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">"</span><span style="color: #000000;">栈空</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">endl;<br>&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>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;SS.top</span><span style="color: #000000;">--</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>}<br><br></span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;TopsStack(sStack&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">SS)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(IsEmptysStack&nbsp;(SS))<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">"</span><span style="color: #000000;">栈空</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">endl;<br>&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>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;SS.sign[SS.top];<br>}<br><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;s;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">"</span><span style="color: #000000;">输入表达式：</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cin</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">s;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;length</span><span style="color: #000000;">=</span><span style="color: #000000;">s.length();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sStack&nbsp;SS;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InitsStack(SS);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</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;">&lt;</span><span style="color: #000000;">length;</span><span style="color: #000000;">++</span><span style="color: #000000;">i)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(s[i]</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;">s[i]</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;">s[i]</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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PushsStack(SS,s[i]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(s[i]</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;">&amp;&amp;!</span><span style="color: #000000;">IsEmptysStack(SS)</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">TopsStack(SS)</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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UpsStack(SS);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(s[i]</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;">&amp;&amp;!</span><span style="color: #000000;">IsEmptysStack(SS)</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">TopsStack(SS)</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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">"</span><span style="color: #000000;">括号匹配次序不正确</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(s[i]</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;">&amp;&amp;!</span><span style="color: #000000;">IsEmptysStack(SS)</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">TopsStack(SS)</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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UpsStack(SS);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(s[i]</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;">&amp;&amp;!</span><span style="color: #000000;">IsEmptysStack(SS)</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">TopsStack(SS)</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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">"</span><span style="color: #000000;">括号匹配次序不正确</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(s[i]</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;">&amp;&amp;!</span><span style="color: #000000;">IsEmptysStack(SS)</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">TopsStack(SS)</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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UpsStack(SS);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(s[i]</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;">&amp;&amp;!</span><span style="color: #000000;">IsEmptysStack(SS)</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">TopsStack(SS)</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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">"</span><span style="color: #000000;">括号匹配次序不正确</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">((s[i]</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;">s[i]</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;">s[i]</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;">&amp;&amp;</span><span style="color: #000000;">IsEmptysStack(SS))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">"</span><span style="color: #000000;">右括号多于左括号</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(</span><span style="color: #000000;">!</span><span style="color: #000000;">IsEmptysStack(SS))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">"</span><span style="color: #000000;">左括号多于右括号</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(i</span><span style="color: #000000;">=</span><span style="color: #000000;">(length</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">)</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">IsEmptysStack(SS))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">"</span><span style="color: #000000;">括号匹配正确</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;system(</span><span style="color: #000000;">"</span><span style="color: #000000;">PAUSE</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&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>}<br></span></div>
<br>     <img src ="http://www.cppblog.com/GUO/aggbug/126483.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/GUO/" target="_blank">CrazyNerd</a> 2010-09-12 23:11 <a href="http://www.cppblog.com/GUO/archive/2010/09/12/126483.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]C++常规DLL应用方式介绍</title><link>http://www.cppblog.com/GUO/archive/2010/09/10/126305.html</link><dc:creator>CrazyNerd</dc:creator><author>CrazyNerd</author><pubDate>Fri, 10 Sep 2010 05:21:00 GMT</pubDate><guid>http://www.cppblog.com/GUO/archive/2010/09/10/126305.html</guid><wfw:comment>http://www.cppblog.com/GUO/comments/126305.html</wfw:comment><comments>http://www.cppblog.com/GUO/archive/2010/09/10/126305.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/GUO/comments/commentRss/126305.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/GUO/services/trackbacks/126305.html</trackback:ping><description><![CDATA[原文：<a style="color: #ff0000;" target="_blank"  href="http://developer.51cto.com/art/201002/183651.htm">http://developer.51cto.com/art/201002/183651.htm
</a><br><br>
<p><a href="http://developer.51cto.com/art/200709/56340.htm">C++</a>中的DLL应用在实际编程中是非常重要的一个基础概念，掌握了这一应用对于我们程序开有着非常重要的作用。在这里我们将会针对C++常规DLL做一个详细介绍，希望能给大家带来一些帮助。</p>
<p><strong> C++常规DLL的建立与使用</strong> </p>
<p>1：导出函数</p>
<pre>
<ol class="dp-xml">
    <li class="alt">__declspec(dllexport)&nbsp;void&nbsp;ShowDlg(void) &nbsp;</li>
    <li>{ &nbsp;</li>
    <li class="alt">CDllDialog&nbsp;dllDialog; &nbsp;</li>
    <li>dllDialog.DoModal&nbsp;(); &nbsp;</li>
    <li class="alt">}&nbsp;</li>
</ol>
</pre>
<p>2：修改.def文件，加上函数名称</p>
<pre>
<ol class="dp-xml">
    <li class="alt">;&nbsp;DrawTestDll.def&nbsp;:&nbsp;Declares&nbsp;the&nbsp;module&nbsp;parameters&nbsp;for&nbsp;the&nbsp;DLL. &nbsp;</li>
    <li>&nbsp;</li>
    <li class="alt">LIBRARY&nbsp;"DrawTestDll" &nbsp;</li>
    <li>DESCRIPTION&nbsp;'DrawTestDll&nbsp;Windows&nbsp;Dynamic&nbsp;Link&nbsp;Library' &nbsp;</li>
    <li class="alt">&nbsp;</li>
    <li>EXPORTS &nbsp;</li>
    <li class="alt">;&nbsp;Explicit&nbsp;exports&nbsp;can&nbsp;go&nbsp;here&nbsp;</li>
</ol>
</pre>
<p>3：将DLL文件复制到程序所在目录</p>
<p>4：在程序里调用DLL</p>
<pre>
<ol class="dp-xml">
    <li class="alt">void&nbsp;CDllTestView::OnLButtonDown(UINT&nbsp;nFlags,&nbsp;CPoint&nbsp;point) &nbsp;</li>
    <li>{ &nbsp;</li>
    <li class="alt">typedef&nbsp;void&nbsp;(*lpFun)(void); &nbsp;</li>
    <li>HINSTANCE&nbsp;hDll;&nbsp;//DLL句柄 &nbsp;</li>
    <li class="alt">hDll&nbsp;=&nbsp;LoadLibrary("DrawTestDll.dll");&nbsp;//加载DLL资源 &nbsp;</li>
    <li>if&nbsp;(NULL==hDll)&nbsp;//寻找顺序，EXE所在目录，工程所在目录，System、windows目录 &nbsp;</li>
    <li class="alt">{ &nbsp;</li>
    <li>MessageBox("DLL加载失败"); &nbsp;</li>
    <li class="alt">} &nbsp;</li>
    <li>lpFun&nbsp;addFun;&nbsp;//函数指针 &nbsp;</li>
    <li class="alt">addFun&nbsp;=&nbsp;(lpFun)GetProcAddress(hDll,"ShowDlg");&nbsp;//得到函数ShowDlg的地址 &nbsp;</li>
    <li>if&nbsp;(NULL==addFun) &nbsp;</li>
    <li class="alt">{ &nbsp;</li>
    <li>MessageBox("DLL中函数寻找失败"); &nbsp;</li>
    <li class="alt">} &nbsp;</li>
    <li>HINSTANCE&nbsp;exe_hinstance=AfxGetResourceHandle();&nbsp;//得到主程序的实例句柄 &nbsp;</li>
    <li class="alt">AfxSetResourceHandle(hDll);&nbsp;//设置主程序的句柄为DLL实例（利用DLL里的资源） &nbsp;</li>
    <li>addFun();&nbsp;//调用函数 &nbsp;</li>
    <li class="alt">AfxSetResourceHandle(exe_hinstance);//重新设置主程序的实例句柄 &nbsp;</li>
    <li>FreeLibrary(hDll);&nbsp;//赦放DLL资源 &nbsp;</li>
    <li class="alt">}&nbsp;</li>
</ol>
</pre>
<p><strong> C++常规DLL中类的使用</strong> </p>
<p>1：DLL中添加新类</p>
<p>类的.h文件：<br>
&nbsp;</p>
<pre>
<ol class="dp-xml">
    <li class="alt">//导出一个类(包括其方法、属性) &nbsp;</li>
    <li>class&nbsp;_declspec(dllexport)&nbsp;CDllClass&nbsp;{ &nbsp;</li>
    <li class="alt">public: &nbsp;</li>
    <li>CDllClass(void); &nbsp;</li>
    <li class="alt">void&nbsp;MSG(const&nbsp;char&nbsp;*&nbsp;const&nbsp;str); &nbsp;</li>
    <li>};&nbsp;</li>
</ol>
</pre>
<p>类的.cpp文件：</p>
<pre>
<ol class="dp-xml">
    <li class="alt">#include&nbsp;"stdafx.h" &nbsp;</li>
    <li>#include&nbsp;"DllClass.h" &nbsp;</li>
    <li class="alt">&nbsp;</li>
    <li>CDllClass::CDllClass() &nbsp;</li>
    <li class="alt">{ &nbsp;</li>
    <li>return; &nbsp;</li>
    <li class="alt">} &nbsp;</li>
    <li>void&nbsp;CDllClass::MSG(const&nbsp;char&nbsp;*&nbsp;const&nbsp;str) &nbsp;</li>
    <li class="alt">{ &nbsp;</li>
    <li>MessageBox(NULL,str,"",MB_OK); &nbsp;</li>
    <li class="alt">}&nbsp;</li>
</ol>
</pre>
<p>2：将编译好的DLL文件、Lib文件和类的头文件复制到工程目录</p>
<p>3：修改类的头文件（将dll的头文件中为 dllexport,在应用文件中为dllimport）</p>
<pre>
<ol class="dp-xml">
    <li class="alt">//导入一个类(包括其方法、属性) &nbsp;</li>
    <li>class&nbsp;_declspec(dllimport)&nbsp;CDllClass&nbsp;{ &nbsp;</li>
    <li class="alt">public: &nbsp;</li>
    <li>CDllClass(void); &nbsp;</li>
    <li class="alt">void&nbsp;MSG(const&nbsp;char&nbsp;*&nbsp;const&nbsp;str); &nbsp;</li>
    <li>};&nbsp;</li>
</ol>
</pre>
<p>4：在调用类的实现函数的文件里加上类的头文件和Lib文件的引用</p>
<pre>
<ol class="dp-xml">
    <li class="alt">#include&nbsp;"DllClass.h"&nbsp;//头文件的引入，是程序可以定义类的对象 &nbsp;</li>
    <li>#pragma&nbsp;comment(lib,"DrawDll.lib")&nbsp;//具体函数的定义&nbsp;</li>
</ol>
</pre>
<p>正常使用即可。以上就是对C++常规DLL的相关介绍。</p>
<br><br><img src ="http://www.cppblog.com/GUO/aggbug/126305.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/GUO/" target="_blank">CrazyNerd</a> 2010-09-10 13:21 <a href="http://www.cppblog.com/GUO/archive/2010/09/10/126305.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]C++头文件包含内容概览</title><link>http://www.cppblog.com/GUO/archive/2010/09/10/126300.html</link><dc:creator>CrazyNerd</dc:creator><author>CrazyNerd</author><pubDate>Fri, 10 Sep 2010 04:44:00 GMT</pubDate><guid>http://www.cppblog.com/GUO/archive/2010/09/10/126300.html</guid><wfw:comment>http://www.cppblog.com/GUO/comments/126300.html</wfw:comment><comments>http://www.cppblog.com/GUO/archive/2010/09/10/126300.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/GUO/comments/commentRss/126300.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/GUO/services/trackbacks/126300.html</trackback:ping><description><![CDATA[原文：<a style="color: #ff0000;" target="_blank"  href="http://developer.51cto.com/art/201002/183607.htm">http://developer.51cto.com/art/201002/183607.htm</a><br><br>
<div class="sum">
<ul class="summary">我们在这里主要从C、传统 C++；标准 C++以及C99 增加等方面来为大家总结了C++头文件的各种类型，以方便大家将来的应用。</ul>
    </div>
    <p><a href="http://developer.51cto.com/art/200709/56340.htm">C++</a>中对于头文件的应用是一个比较复杂的步骤，其中有很多比较重要的内容值得我们去不断的学习。在这里我们先来为大家总结一下C++头文件中的各种类型，以方便大家将来的应用。</p>
    <br>
    <p><strong> C++头文件之C、传统 C++ </strong> </p>
    <ol class="dp-xml">
        <li class="alt">#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">assert.h&gt;</font></strong> //设定插入点&nbsp; &nbsp;</li>
        <li>#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">ctype.h&gt;</font></strong> &nbsp;//字符处理&nbsp; &nbsp;</li>
        <li class="alt">#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">errno.h&gt;</font></strong> &nbsp;//定义错误码&nbsp; &nbsp;</li>
        <li>#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">float.h&gt;</font></strong> &nbsp;//浮点数处理&nbsp; &nbsp;</li>
        <li class="alt">#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">fstream.h&gt;</font></strong> 　&nbsp;//文件输入／输出&nbsp; &nbsp;</li>
        <li>#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">iomanip.h&gt;</font></strong> 　&nbsp;//参数化输入／输出&nbsp; &nbsp;</li>
        <li class="alt">#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">iostream.h&gt;</font></strong> 　//数据流输入／输出&nbsp; &nbsp;</li>
        <li>#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">limits.h&gt;</font></strong> //定义各种数据类型最值常量&nbsp; &nbsp;</li>
        <li class="alt">#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">locale.h&gt;</font></strong> //定义本地化函数&nbsp; &nbsp;</li>
        <li>#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">math.h&gt;</font></strong> 　//定义数学函数&nbsp; &nbsp;</li>
        <li class="alt">#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">stdio.h&gt;</font></strong> &nbsp;//定义输入／输出函数&nbsp; &nbsp;</li>
        <li>#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">stdlib.h&gt;</font></strong> //定义杂项函数及内存分配函数&nbsp; &nbsp;</li>
        <li class="alt">#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">string.h&gt;</font></strong> //字符串处理&nbsp; &nbsp;</li>
        <li>#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">strstrea.h&gt;</font></strong> 　//基于数组的输入／输出&nbsp; &nbsp;</li>
        <li class="alt">#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">time.h&gt;</font></strong> 　//定义关于时间的函数&nbsp; &nbsp;</li>
        <li>#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">wchar.h&gt;</font></strong> &nbsp;//宽字符处理及输入／输出&nbsp; &nbsp;</li>
        <li class="alt">#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">wctype.h&gt;</font></strong> //宽字符分类&nbsp;&nbsp;</li>
    </ol>
    <p><strong> C++头文件之标准 C++　（同上的不再注释） </strong> </p>
    <ol class="dp-xml">
        <li class="alt">#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">algorithm&gt;</font></strong> 　&nbsp;//STL&nbsp;通用算法&nbsp; &nbsp;</li>
        <li>#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">bitset&gt;</font></strong> 　//STL&nbsp;位集容器&nbsp; &nbsp;</li>
        <li class="alt">#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">cctype&gt;</font></strong> &nbsp; &nbsp;</li>
        <li>#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">cerrno&gt;</font></strong> &nbsp; &nbsp;</li>
        <li class="alt">#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">clocale&gt;</font></strong> &nbsp; &nbsp;</li>
        <li>#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">cmath&gt;</font></strong> &nbsp; &nbsp;</li>
        <li class="alt">#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">complex&gt;</font></strong> &nbsp;//复数类&nbsp; &nbsp;</li>
        <li>#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">cstdio&gt;</font></strong> &nbsp; &nbsp;</li>
        <li class="alt">#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">cstdlib&gt;</font></strong> &nbsp; &nbsp;</li>
        <li>#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">cstring&gt;</font></strong> &nbsp; &nbsp;</li>
        <li class="alt">#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">ctime&gt;</font></strong> &nbsp; &nbsp;</li>
        <li>#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">deque&gt;</font></strong> 　&nbsp;//STL&nbsp;双端队列容器&nbsp; &nbsp;</li>
        <li class="alt">#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">exception&gt;</font></strong> 　&nbsp;//异常处理类&nbsp; &nbsp;</li>
        <li>#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">fstream&gt;</font></strong> &nbsp; &nbsp;</li>
        <li class="alt">#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">functional&gt;</font></strong> 　//STL&nbsp;定义运算函数（代替运算符）&nbsp; &nbsp;</li>
        <li>#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">limits&gt;</font></strong> &nbsp; &nbsp;</li>
        <li class="alt">#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">list&gt;</font></strong> //STL&nbsp;线性列表容器&nbsp; &nbsp;</li>
        <li>#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">map&gt;</font></strong> &nbsp;//STL&nbsp;映射容器&nbsp; &nbsp;</li>
        <li class="alt">#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">iomanip&gt;</font></strong> &nbsp; &nbsp;</li>
        <li>#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">ios&gt;</font></strong> &nbsp;//基本输入／输出支持&nbsp; &nbsp;</li>
        <li class="alt">#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">iosfwd&gt;</font></strong> 　//输入／输出系统使用的前置声明&nbsp; &nbsp;</li>
        <li>#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">iostream&gt;</font></strong> &nbsp; &nbsp;</li>
        <li class="alt">#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">istream&gt;</font></strong> &nbsp;//基本输入流&nbsp; &nbsp;</li>
        <li>#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">ostream&gt;</font></strong> &nbsp;//基本输出流&nbsp; &nbsp;</li>
        <li class="alt">#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">queue&gt;</font></strong> 　&nbsp;//STL&nbsp;队列容器&nbsp; &nbsp;</li>
        <li>#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">set&gt;</font></strong> &nbsp;//STL&nbsp;集合容器&nbsp; &nbsp;</li>
        <li class="alt">#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">sstream&gt;</font></strong> &nbsp;//基于字符串的流&nbsp; &nbsp;</li>
        <li>#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">stack&gt;</font></strong> 　&nbsp;//STL&nbsp;堆栈容器&nbsp; &nbsp;</li>
        <li class="alt">#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">stdexcept&gt;</font></strong> 　&nbsp;//标准异常类&nbsp; &nbsp;</li>
        <li>#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">streambuf&gt;</font></strong> 　&nbsp;//底层输入／输出支持&nbsp; &nbsp;</li>
        <li class="alt">#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">string&gt;</font></strong> 　//字符串类&nbsp; &nbsp;</li>
        <li>#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">utility&gt;</font></strong> &nbsp;//STL&nbsp;通用模板类&nbsp; &nbsp;</li>
        <li class="alt">#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">vector&gt;</font></strong> 　//STL&nbsp;动态数组容器&nbsp; &nbsp;</li>
        <li>#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">cwchar&gt;</font></strong> &nbsp; &nbsp;</li>
        <li class="alt">#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">cwctype&gt;</font></strong> &nbsp; &nbsp;</li>
        <li>using&nbsp;namespace&nbsp;std;&nbsp;&nbsp;</li>
    </ol>
    <p><strong> C++头文件之C99 增加 </strong> </p>
    <ol class="dp-xml">
        <li class="alt">#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">complex.h&gt;</font></strong> &nbsp;//复数处理&nbsp; &nbsp;</li>
        <li>#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">fenv.h&gt;</font></strong> //浮点环境&nbsp; &nbsp;</li>
        <li class="alt">#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">inttypes.h&gt;</font></strong> //整数格式转换&nbsp; &nbsp;</li>
        <li>#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">stdbool.h&gt;</font></strong> &nbsp;//布尔环境&nbsp; &nbsp;</li>
        <li class="alt">#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">stdint.h&gt;</font></strong> 　//整型环境&nbsp; &nbsp;</li>
        <li>#include&nbsp;<strong> <font color="#006699">&lt;</font></strong> &nbsp;<strong> <font color="#006699">tgmath.h&gt;</font></strong> 　//通用类型数学宏&nbsp; <br></li>
    </ol>
    <br><br><img src ="http://www.cppblog.com/GUO/aggbug/126300.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/GUO/" target="_blank">CrazyNerd</a> 2010-09-10 12:44 <a href="http://www.cppblog.com/GUO/archive/2010/09/10/126300.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>进程间通信的11种方法</title><link>http://www.cppblog.com/GUO/archive/2010/09/10/126277.html</link><dc:creator>CrazyNerd</dc:creator><author>CrazyNerd</author><pubDate>Thu, 09 Sep 2010 16:42:00 GMT</pubDate><guid>http://www.cppblog.com/GUO/archive/2010/09/10/126277.html</guid><wfw:comment>http://www.cppblog.com/GUO/comments/126277.html</wfw:comment><comments>http://www.cppblog.com/GUO/archive/2010/09/10/126277.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/GUO/comments/commentRss/126277.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/GUO/services/trackbacks/126277.html</trackback:ping><description><![CDATA[<p><font id="zoom" class="f14">摘自internet，查看更详细更精彩的知识讲解，请自己<a style="color: #ff0000;" target="_blank" href="http://www.google.com/">google</a></font>
<br></p>
<p>进程间通信有以下方法<br><br>Using named objects <br>Waiting for multiple objects <br>Waiting in a message loop <br>Using mutex objects <br>Using semaphore objects <br>Using event objects <br>Using critical section objects <br>Using timer queues <br>Using waitable timer objects <br>CreateFileMapping<br>我觉得还是用event比较方便<br><br>
<table border="0" cellpadding="0" cellspacing="0" width="580">
    <tbody>
        <tr>
            <td><br></td>
            <td colspan="3"><br></td>
        </tr>
    </tbody>
</table>
<strong> &nbsp; 进程间的通讯实现（IPC）的11种方法</strong> &nbsp;&nbsp;&nbsp;&nbsp; <br>
</p>
<p>&nbsp;进程通常被定义为一个正在运行的程序的实例，它由两个部分组成：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个是操作系统用来管理进程的内核对象。内核对象也是系统用来存放关于进程的统计信息的地方<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
另一个是地址空间，它包含所有的可执行模块或DLL模块的代码和数据。它还包含动态分配的空间。如线程堆栈和堆分配空间。每个进程被赋予它自己的虚拟地址
空间，当进程中的一个线程正在运行时，该线程可以访问只属于它的进程的内存。属于其它进程的内存则是隐藏的，并不能被正在运行的线程访问。<br>&nbsp;&nbsp; 为了能在两个进程之间进行通讯，由以下几种方法可供参考：</p>
<p>0。剪贴板Clipboard: 在16位时代常使用的方式，CWnd中提供支持</p>
<p>1。窗口消息 标准的Windows消息以及专用的WM_COPYDATA消息 SENDMESSAGE()接收端必须有一个窗口</p>
<p>2。使用共享内存方式（Shared Memory)<br>&nbsp;&nbsp; a.设定一块共享内存区域&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; HANDLE CreateFileMapping(HANDLE,LPSECURITY_ATTRIBUTES, DWORD,&nbsp;DWORD, DWORD,&nbsp; LPCSTR) <br>&nbsp;&nbsp;&nbsp;&nbsp; 产生一个file-mapping核心对象<br>&nbsp;&nbsp;&nbsp;&nbsp; LPVOID MapViewOfFile(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HANDLE hFileMappingObject,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD&nbsp; dwDesiredAcess,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD&nbsp; dwFileOffsetHigh,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD&nbsp; dwFileOffsetLow,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD&nbsp; dwNumberOfBytesToMap<br>&nbsp;&nbsp;&nbsp;&nbsp; );<br>&nbsp;&nbsp;&nbsp; 得到共享内存的指针<br>&nbsp;&nbsp; b.找出共享内存<br>&nbsp;&nbsp;&nbsp; 决定这块内存要以点对点（peer to peer)的形式呈现<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 每个进程都必须有相同的能力，产生共享内存并将它初始化。每个进程<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 都应该调用CreateFileMapping(),然后调用GetLastError().如果传回的<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 错误代码是ERROR_ALREADY_EXISTS,那么进程就可以假设这一共享内存区 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 域已经被别的进程打开并初始化了，否则该进程就可以合理的认为自己 排在第&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一位，并接下来将共享内存初始化。<br>&nbsp;&nbsp;&nbsp; 还是要使用client/server架构中<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 只有server进程才应该产生并初始化共享内存。所有的进程都应该使用</p>
<p>HANDLE OpenFileMapping(DWORD dwDesiredAccess,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BOOL bInheritHandle,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LPCTSTR lpName);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 再调用MapViewOfFile(),取得共享内存的指针<br>&nbsp;&nbsp; c.同步处理(Mutex)<br>&nbsp;&nbsp; d.清理(Cleaning up) BOOL UnmapViewOfFile(LPCVOID lpBaseAddress);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CloseHandle()</p>
<p>3。动态数据交换（DDE）通过维护全局分配内存使的应用程序间传递成为可能<br>&nbsp;&nbsp; 其方式是再一块全局内存中手工放置大量的数据，然后使用窗口消息传递内存&nbsp;&nbsp;&nbsp; 指针.这是16位WIN时代使用的方式，因为在WIN32下已经没有全局和局部内存&nbsp;&nbsp;&nbsp; 了，现在的内存只有一种就是虚存。&nbsp;&nbsp; </p>
<p>4。消息管道(Message Pipe)<br>&nbsp;&nbsp; 用于设置应用程序间的一条永久通讯通道，通过该通道可以象自己的应用程序<br>&nbsp;&nbsp; 访问一个平面文件一样读写数据。<br>&nbsp;&nbsp; 匿名管道(Anonymous Pipes)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 单向流动，并且只能够在同一电脑上的各个进程之间流动。<br>&nbsp;&nbsp; 命名管道(Named Pipes)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 双向，跨网络，任何进程都可以轻易的抓住，放进管道的数据有固定的格&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 式，而使用ReadFile()只能读取该大小的倍数。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以被使用于I/O Completion Ports</p>
<p>5&nbsp;&nbsp; 邮件槽(Mailslots)<br>&nbsp;&nbsp;&nbsp; 广播式通信,在32系统中提供的新方法，可以在不同主机间交换数据，在&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WIN9X下只支持邮件槽客户</p>
<p>6。Windows套接字(Windows Socket)<br>&nbsp;&nbsp; 它具备消息管道所有的功能，但遵守一套通信标准使的不同操作系统之上的应&nbsp;&nbsp;&nbsp; 用程序之间可以互相通信。</p>
<p>7。Internet通信 它让应用程序从Internet地址上载或下载文件</p>
<p>8。RPC：远程过程调用，很少使用，因其与UNIX的RPC不兼容。</p>
<p>9。串行/并行通信(Serial/Parallel Communication)<br>&nbsp;&nbsp; 它允许应用程序通过串行或并行端口与其他的应用程序通信</p>
<p>10。COM/DCOM <br>&nbsp;&nbsp;&nbsp;&nbsp; 通过COM系统的代理存根方式进行进程间数据交换，但只能够表现在对接口&nbsp;&nbsp;&nbsp;&nbsp; 函数的调用时传送数据，通过DCOM可以在不同主机间传送数据。 </p>
<br> <img src ="http://www.cppblog.com/GUO/aggbug/126277.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/GUO/" target="_blank">CrazyNerd</a> 2010-09-10 00:42 <a href="http://www.cppblog.com/GUO/archive/2010/09/10/126277.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>little endian和big endian的概念解释</title><link>http://www.cppblog.com/GUO/archive/2010/09/10/126276.html</link><dc:creator>CrazyNerd</dc:creator><author>CrazyNerd</author><pubDate>Thu, 09 Sep 2010 16:24:00 GMT</pubDate><guid>http://www.cppblog.com/GUO/archive/2010/09/10/126276.html</guid><wfw:comment>http://www.cppblog.com/GUO/comments/126276.html</wfw:comment><comments>http://www.cppblog.com/GUO/archive/2010/09/10/126276.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/GUO/comments/commentRss/126276.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/GUO/services/trackbacks/126276.html</trackback:ping><description><![CDATA[<font id="zoom" class="f14">摘自internet，查看更详细更精彩的知识讲解，请自己<a style="color: #ff0000;" target="_blank" href="http://www.google.com/">google</a><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; little&nbsp;endian和big&nbsp;endian是表示计算机字节顺序的两种格式,所谓的字节顺序指的是长度跨越多个字节的数据的存放形式.
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 假设从地址0x00000000开始的一个字中保存有数据0x1234abcd,那么在两种不同的内存顺序的机器上从字节的角度去看的话分别表示为:
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1)little&nbsp;endian:在内存中的存放顺序是0x00000000-0xcd,0x00000001-0xab,0x00000002-0x34,0x00000003-0x12
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2)big&nbsp;&nbsp;endian:在内存中的存放顺序是0x00000000-0x12,0x00000001-0x34,0x00000002-0xab,0x00000003-0xcd
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;需要特别说明的是,以上假设机器是每个内存单元以8位即一个字节为单位的.
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;简单的说,ittle&nbsp;endian把低字节存放在内存的低位；而big&nbsp;endian将低字节存放在内存的高位.
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;现在主流的CPU,intel系列的是采用的little&nbsp;endian的格式存放数据,而motorola系列的CPU采用的是big&nbsp;endian.
</font>
<br>  <img src ="http://www.cppblog.com/GUO/aggbug/126276.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/GUO/" target="_blank">CrazyNerd</a> 2010-09-10 00:24 <a href="http://www.cppblog.com/GUO/archive/2010/09/10/126276.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]嵌入式软件开发 笔试题</title><link>http://www.cppblog.com/GUO/archive/2010/09/10/126275.html</link><dc:creator>CrazyNerd</dc:creator><author>CrazyNerd</author><pubDate>Thu, 09 Sep 2010 16:17:00 GMT</pubDate><guid>http://www.cppblog.com/GUO/archive/2010/09/10/126275.html</guid><wfw:comment>http://www.cppblog.com/GUO/comments/126275.html</wfw:comment><comments>http://www.cppblog.com/GUO/archive/2010/09/10/126275.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/GUO/comments/commentRss/126275.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/GUO/services/trackbacks/126275.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt; font-family: 新宋体;">
<p><font size="4"><span style="font-size: 10pt;">原文：http://www.cnblogs.com/chengxuyuan/archive/2008/12/08/1350335.html
</span><br></font></p>
<p><font size="4"><br></font></p>
<p><font size="4"></font></p>
<span style="font-size: 10pt;">
<p><font size="4"><span style="font-size: 12pt;">1 读程序段，回答问题</span><br>
<span style="font-size: 10pt;">int main(int argc,char *argv[])<br>
{<br>
&nbsp;&nbsp;&nbsp; int c=9,d=0;<br>
&nbsp;&nbsp;&nbsp; c=c++%5;<br>
&nbsp;&nbsp;&nbsp; d=c;<br>
&nbsp;&nbsp;&nbsp; printf("d=%dn",d);<br>
&nbsp;&nbsp;&nbsp; return 0;<br>
}</span><br>
<span style="font-size: 12pt;">a) 写出程序输出<br>
b) 在一个可移植的系统中这种表达式是否存在风险？why?</span></font></p>
<p><font size="4">#include "stdio.h"<br>
int a=0; <br>
int b;<br>
static char c;<br>
int main(int argc,char *argv[])<br>
{<br>
&nbsp;&nbsp;&nbsp; char d=4;<br>
&nbsp;&nbsp;&nbsp; static short e;</font></p>
<p><font size="4">&nbsp;&nbsp;&nbsp; a++;<br>
&nbsp;&nbsp;&nbsp; b=100;<br>
&nbsp;&nbsp;&nbsp; c=(char)++a;<br>
&nbsp;&nbsp;&nbsp; e=(++d)++;<br>
&nbsp;&nbsp;&nbsp; printf("a=%d, b=%d, c=%d, d= %d, e=%d",a,b,c,d,e);<br>
&nbsp;&nbsp;&nbsp; return 0;<br>
}<br>
a) 写出程序输出<br>
b) 编译器如果安排各个变量(a,b,c,d)在内存中的布局(eg. stack,heap,data section,bss section),最好用图形方式描述。</font></p>
<p><font size="4">2 中断是嵌入式系统中重要的组成部分，这导致了许多编译开发商提供一种扩展：让标准C支持中断，产生了一个新的关键字__interrupt。下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论以下这段代码。<br>
__interrupt double compute_area(double radius)<br>
{<br>
double area = PI * radius *radius;<br>
printf("nArea = %f", area);<br>
return area;<br>
}</font></p>
<p><font size="4"></font></p>
<span style="font-size: 12pt;">
<p><font size="4">3 C/C++基础知识问题<br>
a) 关键字volatile在编译时有什么含义?并给出三个不同使用场景的例子(可以伪代码或者文字描述)。<br>
b) C语言中static关键字的具体作用有哪些 ?<br>
c) 请问下面三种变量声明有何区别?请给出具体含义<br>
&nbsp;&nbsp;&nbsp;&nbsp; int const *p;<br>
&nbsp;&nbsp;&nbsp;&nbsp; int* const p;<br>
&nbsp;&nbsp;&nbsp;&nbsp; int const* const p;</font></p>
<p><font size="4"></font></p>
<span style="font-size: 12pt;">
<p><font size="4">4 嵌入式系统相关问题</font></p>
</span></span><span style="font-size: 12pt;">
<p><font size="4"><br>
a) 对于整形变量A=0x12345678,请画出在little endian及big endian的方式下在内存中是如何存储的。<br>
b) 在ARM系统中，函数调用的时候，参数是通过哪种方式传递的?<br>
c) 中断(interrupt,如键盘中断)与异常(exception,如除零异常)有何区别?</font></p>
<p><font size="4">5 设周期性任务P1,P2,P3的周期为T1,T2,T3分别为100，150，400；执行时间分别为20，40，100。请设计一种调度算法进行任务调度，满足任务执行周期及任务周期。</font></p>
<p><font size="4">6 优先级反转问题在嵌入式系统中是一中严重的问题，必须给与足够重视。<br>
a) 首先请解释优先级反转问题<br>
b) 很多RTOS提供优先级继承策略(Priority inheritance)和优先级天花板策略(Priority ceilings)用来解决优先级反转问题，请讨论这两种策略。</font></p>
</span>
<p><font size="4"></font></p>
</span>
<p><font size="4"></font></p>
<br> </span><img src ="http://www.cppblog.com/GUO/aggbug/126275.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/GUO/" target="_blank">CrazyNerd</a> 2010-09-10 00:17 <a href="http://www.cppblog.com/GUO/archive/2010/09/10/126275.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]嵌入式程序员应知道的10个基本问题</title><link>http://www.cppblog.com/GUO/archive/2010/09/10/126273.html</link><dc:creator>CrazyNerd</dc:creator><author>CrazyNerd</author><pubDate>Thu, 09 Sep 2010 16:14:00 GMT</pubDate><guid>http://www.cppblog.com/GUO/archive/2010/09/10/126273.html</guid><wfw:comment>http://www.cppblog.com/GUO/comments/126273.html</wfw:comment><comments>http://www.cppblog.com/GUO/archive/2010/09/10/126273.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/GUO/comments/commentRss/126273.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/GUO/services/trackbacks/126273.html</trackback:ping><description><![CDATA[原文地址不详<br><br>
<p>预处理器（Preprocessor）</p>
<p>1 . 用预处理指令#define 声明一个常数，用以表明1年中有多少秒（忽略闰年问题）<br>#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL<br>我在这想看到几件事情：<br>1) #define 语法的基本知识（例如：不能以分号结束，括号的使用，等等）<br>2)懂得预处理器将为你计算常数表达式的值，因此，直接写出你是如何计算一年中有多少秒而不是计算出实际的值，是更清晰而没有代价的。<br>3) 意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数是的长整型数。<br>4) 如果你在你的表达式中用到UL（表示无符号长整型），那么你有了一个好的起点。记住，第一印象很重要。</p>
<p>2 . 写一个&#8221;标准&#8221;宏MIN ，这个宏输入两个参数并返回较小的一个。<br>#define MIN(A,B) （（A） &lt;= (B) ? (A) : (B))<br>这个测试是为下面的目的而设的：<br>1) 标识#define在宏中应用的基本知识。这是很重要的。因为在 嵌入(inline)操作符 变为标准C的一部分之前，宏是方便产生嵌入代码的唯一方法，对于嵌入式系统来说，为了能达到要求的性能，嵌入代码经常是必须的方法。<br>2)三重条件操作符的知识。这个操作符存在C语言中的原因是它使得编译器能产生比if-then-else更优化的代码，了解这个用法是很重要的。<br>3) 懂得在宏中小心地把参数用括号括起来<br>4) 我也用这个问题开始讨论宏的副作用，例如：当你写下面的代码时会发生什么事？<br>least = MIN(*p++, b);</p>
<p>3. 预处理器标识#error的目的是什么？<br>如果你不知道答案，请看参考文献1。这问题对区分一个正常的伙计和一个书呆子是很有用的。只有书呆子才会读C语言课本的附录去找出象这种问题的答案。当然如果你不是在找一个书呆子，那么应试者最好希望自己不要知道答案。<br>死循环（Infinite loops）</p>
<p>4. 嵌入式系统中经常要用到无限循环，你怎么样用C编写死循环呢？<br>这个问题用几个解决方案。我首选的方案是：</p>
<p>while(1)<br>{</p>
<p>}</p>
<p>一些程序员更喜欢如下方案：</p>
<p>for(;;)<br>{</p>
<p>}</p>
<p>这个实现方式让我为难，因为这个语法没有确切表达到底怎么回事。如果一个应试者给出这个作为方案，我将用这个作为一个机会去探究他们这样做的基本原理。如果他们的基本答案是：&#8221;我被教着这样做，但从没有想到过为什么。&#8221;这会给我留下一个坏印象。</p>
<p>第三个方案是用 goto<br>Loop:<br>&#8230;<br>goto Loop;<br>应试者如给出上面的方案，这说明或者他是一个汇编语言程序员（这也许是好事）或者他是一个想进入新领域的BASIC/FORTRAN程序员。<br>数据声明（Data declarations）</p>
<p>5. 用变量a给出下面的定义<br>a) 一个整型数（An integer）<br>b)一个指向整型数的指针（ A pointer to an integer）<br>c)一个指向指针的的指针，它指向的指针是指向一个整型数（ A pointer to a pointer to an intege）r<br>d)一个有10个整型数的数组（ An array of 10 integers）<br>e) 一个有10个指针的数组，该指针是指向一个整型数的。（An array of 10 pointers to integers）<br>f) 一个指向有10个整型数数组的指针（ A pointer to an array of 10 integers）<br>g) 一个指向函数的指针，该函数有一个整型参数并返回一个整型数（A pointer to a function that takes an integer as an argument and returns an integer）<br>h)
一个有10个指针的数组，该指针指向一个函数，该函数有一个整型参数并返回一个整型数（ An array of ten pointers
tofunctions that take an integer argument and return an integer ）</p>
<p>答案是：<br>a) int a; // An integer<br>b) int *a; // A pointer to an integer<br>c) int **a; // A pointer to a pointer to an integer<br>d) int a[10]; // An array of 10 integers<br>e) int *a[10]; // An array of 10 pointers to integers<br>f) int (*a)[10]; // A pointer to an array of 10 integers<br>g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer<br>h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer</p>
<p>人们经常声称这里有几个问题是那种要翻一下书才能回答的问题，我同意这种说法。当我写这篇文章时，为了确定语法的正确性，我的确查了一下书。但是当
我被面试的时候，我期望被问到这个问题（或者相近的问题）。因为在被面试的这段时间里，我确定我知道这个问题的答案。应试者如果不知道所有的答案（或至少
大部分答案），那么也就没有为这次面试做准备，如果该面试者没有为这次面试做准备，那么他又能为什么出准备呢？</p>
<p>Static</p>
<p>6. 关键字static的作用是什么？<br>这个简单的问题很少有人能回答完全。在C语言中，关键字static有三个明显的作用：<br>1)在函数体，一个被声明为静态的变量在这一函数被调用过程中维持其值不变。<br>2) 在模块内（但在函数体外），一个被声明为静态的变量可以被模块内所用函数访问，但不能被模块外其它函数访问。它是一个本地的全局变量。<br>3) 在模块内，一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是，这个函数被限制在声明它的模块的本地范围内使用。</p>
<p>大多数应试者能正确回答第一部分，一部分能正确回答第二部分，同是很少的人能懂得第三部分。这是一个应试者的严重的缺点，因为他显然不懂得本地化数据和代码范围的好处和重要性。<br>Const</p>
<p>7．关键字const有什么含意？<br>我只要一听到被面试者说：&#8221;const意味着常数&#8221;，我就知道我正在和一个业余者打交道。去年
DanSaks已经在他的文章里完全概括了const的所有用法，因此ESP(译者：Embedded
SystemsProgramming)的每一位读者应该非常熟悉const能做什么和不能做什么.如果你从没有读到那篇文章，只要能说出const意味
着&#8221;只读&#8221;就可以了。尽管这个答案不是完全的答案，但我接受它作为一个正确的答案。（如果你想知道更详细的答案，仔细读一下Saks的文章吧。）<br>如果应试者能正确回答这个问题，我将问他一个附加的问题：<br>下面的声明都是什么意思？</p>
<p>const int a;<br>int const a;<br>const int *a;<br>int * const a;<br>int const * a const;</p>
<p>/******/<br>前两个的作用是一样，a是一个常整型数。第三个意味着a是一个指向常整型数的指针（也就是，整型数是不可修改的，但指针可
以）。第四个意思a是一个指向整型数的常指针（也就是说，指针指向的整型数是可以修改的，但指针是不可修改的）。最后一个意味着a是一个指向常整型数的常
指针（也就是说，指针指向的整型数是不可修改的，同时指针也是不可修改的）。如果应试者能正确回答这些问题，那么他就给我留下了一个好印象。顺带提一句，
也许你可能会问，即使不用关键字const，也还是能很容易写出功能正确的程序，那么我为什么还要如此看重关键字const呢？我也如下的几下理由：<br>1)
关键字const的作用是为给读你代码的人传达非常有用的信息，实际上，声明一个参数为常量是为了告诉了用户这个参数的应用目的。如果你曾花很多时间清理
其它人留下的垃圾，你就会很快学会感谢这点多余的信息。（当然，懂得用const的程序员很少会留下的垃圾让别人来清理的。）<br>2) 通过给优化器一些附加的信息，使用关键字const也许能产生更紧凑的代码。<br>3) 合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数，防止其被无意的代码修改。简而言之，这样可以减少bug的出现。<br>Volatile</p>
<p>8. 关键字volatile有什么含意?并给出三个不同的例子。<br>一个定义为volatile的变量是说这变量可能会被意想不到地改变，这样，编译器就不会去假设这个变量的值了。精确地说就是，优化器在用到这个变量时必须每次都小心地重新读取这个变量的值，而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子：<br>1) 并行设备的硬件寄存器（如：状态寄存器）<br>2) 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)<br>3) 多线程应用中被几个任务共享的变量</p>
<p>回答不出这个问题的人是不会被雇佣的。我认为这是区分C程序员和嵌入式系统程序员的最基本的问题。搞嵌入式的家伙们经常同硬件、中断、RTOS等等打交道，所有这些都要求用到volatile变量。不懂得volatile的内容将会带来灾难。<br>假设被面试者正确地回答了这是问题（嗯，怀疑是否会是这样），我将稍微深究一下，看一下这家伙是不是直正懂得volatile完全的重要性。<br>1)一个参数既可以是const还可以是volatile吗？解释为什么。<br>2); 一个指针可以是volatile 吗？解释为什么。<br>3); 下面的函数有什么错误：</p>
<p>int square(volatile int *ptr)<br>{<br>return *ptr * *ptr;<br>}</p>
<p>下面是答案：<br>1)是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。<br>2); 是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。<br>3) 这段代码有点变态。这段代码的目的是用来返指针*ptr指向值的平方，但是，由于*ptr指向一个volatile型参数，编译器将产生类似下面的代码：</p>
<p>int square(volatile int *ptr)<br>{<br>int a,b;<br>a = *ptr;<br>b = *ptr;<br>return a * b;<br>}</p>
<p>由于*ptr的值可能被意想不到地该变，因此a和b可能是不同的。结果，这段代码可能返不是你所期望的平方值！正确的代码如下：</p>
<p>long square(volatile int *ptr)<br>{<br>int a;<br>a = *ptr;<br>return a * a;<br>}</p>
<p>位操作（Bit manipulation）</p>
<p>9. 嵌入式系统总是要用户对变量或寄存器进行位操作。给定一个整型变量a，写两段代码，第一个设置a的bit 3，第二个清除a 的bit 3。在以上两个操作中，要保持其它位不变。<br>对这个问题有三种基本的反应<br>1)不知道如何下手。该被面者从没做过任何嵌入式系统的工作。<br>2)
用bit
fields。Bitfields是被扔到C语言死角的东西，它保证你的代码在不同编译器之间是不可移植的，同时也保证了的你的代码是不可重用的。我最近
不幸看到Infineon为其较复杂的通信芯片写的驱动程序，它用到了bit
fields因此完全对我无用，因为我的编译器用其它的方式来实现bitfields的。从道德讲：永远不要让一个非嵌入式的家伙粘实际硬件的边。<br>3) 用 #defines 和 bit masks 操作。这是一个有极高可移植性的方法，是应该被用到的方法。最佳的解决方案如下：</p>
<p>#define BIT3 (0&#215;1 &lt;&lt; 3)<br>static int a;</p>
<p>void set_bit3(void)<br>{<br>a |= BIT3;<br>}<br>void clear_bit3(void)<br>{<br>a &amp;= ~BIT3;<br>}</p>
<p>一些人喜欢为设置和清除值而定义一个掩码同时定义一些说明常数，这也是可以接受的。我希望看到几个要点：说明常数、|=和&amp;=~操作。<br>访问固定的内存位置（Accessing fixed memory locations）</p>
<p>10. 嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。在某工程中，要求设置一绝对地址为0&#215;67a9的整型变量的值为0xaa66。编译器是一个纯粹的ANSI编译器。写代码去完成这一任务。<br>这一问题测试你是否知道为了访问一绝对地址把一个整型数强制转换（typecast）为一指针是合法的。这一问题的实现方式随着个人风格不同而不同。典型的类似代码如下：<br>int *ptr;<br>ptr = (int *)0&#215;67a9;<br>*ptr = 0xaa55;</p>
<p>A more obscure approach is:<br>一个较晦涩的方法是：</p>
<p>*(int * const)(0&#215;67a9) = 0xaa55;</p>
<p>即使你的品味更接近第二种方案，但我建议你在面试时使用第一种方案。</p>
<p>中断（Interrupts）</p>
<p>11.中断是嵌入式系统中重要的组成部分，这导致了很多编译开发商提供一种扩展—让标准C支持中断。具代表事实是，产生了一个新的关键字
__interrupt。下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR)，请评论一下这段代码的。</p>
<p>__interrupt double compute_area (double radius)<br>{<br>double area = PI * radius * radius;<br>printf(&#8221;\nArea = %f&#8221;, area);<br>return area;<br>}</p>
<p>这个函数有太多的错误了，以至让人不知从何说起了：<br>1)ISR 不能返回一个值。如果你不懂这个，那么你不会被雇用的。<br>2) ISR 不能传递参数。如果你没有看到这一点，你被雇用的机会等同第一项。<br>3) 在许多的处理器/编译器中，浮点一般都是不可重入的。有些处理器/编译器需要让额处的寄存器入栈，有些处理器/编译器就是不允许在ISR中做浮点运算。此外，ISR应该是短而有效率的，在ISR中做浮点运算是不明智的。<br>4) 与第三点一脉相承，printf()经常有重入和性能上的问题。如果你丢掉了第三和第四点，我不会太为难你的。不用说，如果你能得到后两点，那么你的被雇用前景越来越光明了。<br>代码例子（Code examples）</p>
<p>12 . 下面的代码输出是什么，为什么？</p>
<p>void foo(void)<br>{<br>unsigned int a = 6;<br>int b = -20;<br>(a+b &gt; 6) ? puts(&#8221;&gt; 6&#8243;) : puts(&#8221;&lt;= 6&#8243;);<br>}<br>这
个问题测试你是否懂得C语言中的整数自动转换原则，我发现有些开发者懂得极少这些东西。不管如何，这无符号整型问题的答案是输出是&#8221;&gt;6&#8243;。原因是
当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。因此-20变成了一个非常大的正整数，所以该表达式计算出的结果大于6。这
一点对于应当频繁用到无符号数据类型的嵌入式系统来说是丰常重要的。如果你答错了这个问题，你也就到了得不到这份工作的边缘。</p>
<p>13. 评价下面的代码片断：</p>
<p>unsigned int zero = 0;<br>unsigned int compzero = 0xFFFF;<br>/*1&#8217;s complement of zero */</p>
<p>对于一个int型不是16位的处理器为说，上面的代码是不正确的。应编写如下：</p>
<p>unsigned int compzero = ~0;</p>
<p>这一问题真正能揭露出应试者是否懂得处理器字长的重要性。在我的经验里，好的嵌入式程序员非常准确地明白硬件的细节和它的局限，然而PC机程序往往把硬件作为一个无法避免的烦恼。<br>到
了这个阶段，应试者或者完全垂头丧气了或者信心满满志在必得。如果显然应试者不是很好，那么这个测试就在这里结束了。但如果显然应试者做得不错，那么我就
扔出下面的追加问题，这些问题是比较难的，我想仅仅非常优秀的应试者能做得不错。提出这些问题，我希望更多看到应试者应付问题的方法，而不是答案。不管如
何，你就当是这个娱乐吧&#8230;<br>动态内存分配（Dynamic memory allocation）</p>
<p>14. 尽管不像非嵌入式计算机那么常见，嵌入式系统还是有从堆（heap）中动态分配内存的过程的。那么嵌入式系统中，动态分配内存可能发生的问题是什么？<br>这
里，我期望应试者能提到内存碎片，碎片收集的问题，变量的持行时间等等。这个主题已经在ESP杂志中被广泛地讨论过了（主要是 P.J.Plauger,
他的解释远远超过我这里能提到的任何解释），所有回过头看一下这些杂志吧！让应试者进入一种虚假的安全感觉后，我拿出这么一个小节目：<br>下面的代码片段的输出是什么，为什么？</p>
<p>char *ptr;<br>if ((ptr = (char *)malloc(0)) == NULL)<br>puts(&#8221;Got a null pointer&#8221;);<br>else<br>puts(&#8221;Got a valid pointer&#8221;);</p>
<p>这是一个有趣的问题。最近在我的一个同事不经意把0值传给了函数malloc，得到了一个合法的指针之后，我才想到这个问题。这就是上面的代码，该
代码的输出是&#8221;Got a
validpointer&#8221;。我用这个来开始讨论这样的一问题，看看被面试者是否想到库例程这样做是正确。得到正确的答案固然重要，但解决问题的方法和你
做决定的基本原理更重要些。</p>
<p>Typedef</p>
<p>15 Typedef 在C语言中频繁用以声明一个已经存在的数据类型的同义字。也可以用预处理器做类似的事。例如，思考一下下面的例子：</p>
<p>#define dPS struct s *<br>typedef struct s * tPS;</p>
<p>以上两种情况的意图都是要定义dPS 和 tPS 作为一个指向结构s指针。哪种方法更好呢？（如果有的话）为什么？<br>这是一个非常微妙的问题，任何人答对这个问题（正当的原因）是应当被恭喜的。答案是：typedef更好。思考下面的例子：</p>
<p>dPS p1,p2;<br>tPS p3,p4;</p>
<p>第一个扩展为</p>
<p>struct s * p1, p2;<br>.<br>上面的代码定义p1为一个指向结构的指，p2为一个实际的结构，这也许不是你想要的。第二个例子正确地定义了p3 和p4 两个指针。</p>
<p>&nbsp;</p>
<p>晦涩的语法</p>
<p>16 . C语言同意一些令人震惊的结构,下面的结构是合法的吗，如果是它做些什么？</p>
<p>int a = 5, b = 7, c;<br>c = a+++b;</p>
<p>这个问题将做为这个测验的一个愉快的结尾。不管你相不相信，上面的例子是完全合乎语法的。问题是编译器如何处理它？水平不高的编译作者实际上会争论这个问题，根据最处理原则，编译器应当能处理尽可能所有合法的用法。因此，上面的代码被处理成：</p>
<p>c = a++ + b;</p>
<p>因此, 这段代码持行后a = 6, b = 7, c = 12。<br>如果你知道答案，或猜出正确答案，做得好。如果你不知道答案，我也不把这个当作问题。我发现这个问题的最大好处是这是一个关于代码编写风格，代码的可读性，代码的可修改性的好的话题。</p>
<br><br><img src ="http://www.cppblog.com/GUO/aggbug/126273.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/GUO/" target="_blank">CrazyNerd</a> 2010-09-10 00:14 <a href="http://www.cppblog.com/GUO/archive/2010/09/10/126273.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Office Tab 6.0 破解补丁+注册机 </title><link>http://www.cppblog.com/GUO/archive/2010/09/06/125965.html</link><dc:creator>CrazyNerd</dc:creator><author>CrazyNerd</author><pubDate>Sun, 05 Sep 2010 17:25:00 GMT</pubDate><guid>http://www.cppblog.com/GUO/archive/2010/09/06/125965.html</guid><wfw:comment>http://www.cppblog.com/GUO/comments/125965.html</wfw:comment><comments>http://www.cppblog.com/GUO/archive/2010/09/06/125965.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/GUO/comments/commentRss/125965.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/GUO/services/trackbacks/125965.html</trackback:ping><description><![CDATA[<span style="font-size: 14px;"><span style="font-family: 微软雅黑;">Office&nbsp;Tab
V6.00是&#8220;Office Tab&#8221;的最新版本，不仅支持Microsoft Office 2010，而且支持Microsoft Office
2007和Microsoft Office 2003。这个小工具的主要功能是：通过用户调整，可对Office有关插件（比如：Microsoft
Word ）标签实现自由定制。</span></span>
<p>&nbsp;&nbsp;<span style="font-family: 微软雅黑;"><span style="font-size: 16px;">破解方法：</span></span></p>
<p>&nbsp;&nbsp;<span style="font-family: 微软雅黑;"><span style="font-size: 16px;">把 <span style="color: #ff0000;">OfficeTabFunction.dll </span>复制到 系统所在盘符:\windows\system32 文件夹下面，再用算号器算号！</span></span><br>&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;<span style="font-size: 14px;"><span style="font-family: 微软雅黑;"><a href="http://u.115.com/file/f6fbab6361">http://u.115.com/file/f6fbab6361</a></span></span></p>
<p>&nbsp;&nbsp;<span style="font-size: 14px;"><span style="font-family: 微软雅黑;">Office tab 官方下载网址：</span></span></p>
<p>&nbsp;&nbsp;<span style="font-size: 14px;"><span style="font-family: 微软雅黑;"><a href="http://www.extendoffice.com/en/download.html">http://www.extendoffice.com/en/download.html</a></span></span></p>
<p>&nbsp;&nbsp;<a href="http://s702.photobucket.com/albums/ww27/sebaby/?action=view&amp;current=1008261012e80ea9a12994aeb6.gif" target="_blank"><img src="http://i702.photobucket.com/albums/ww27/sebaby/1008261012e80ea9a12994aeb6.gif" alt="office tab 6.0 破解" border="0"></a></p><img src ="http://www.cppblog.com/GUO/aggbug/125965.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/GUO/" target="_blank">CrazyNerd</a> 2010-09-06 01:25 <a href="http://www.cppblog.com/GUO/archive/2010/09/06/125965.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DirectShow开发基础( 三 )------DirectShow中的事件通知机制</title><link>http://www.cppblog.com/GUO/archive/2010/09/06/125473.html</link><dc:creator>CrazyNerd</dc:creator><author>CrazyNerd</author><pubDate>Sun, 05 Sep 2010 16:57:00 GMT</pubDate><guid>http://www.cppblog.com/GUO/archive/2010/09/06/125473.html</guid><wfw:comment>http://www.cppblog.com/GUO/comments/125473.html</wfw:comment><comments>http://www.cppblog.com/GUO/archive/2010/09/06/125473.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/GUO/comments/commentRss/125473.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/GUO/services/trackbacks/125473.html</trackback:ping><description><![CDATA[<span style="color: #20ff00; background-color: #020000;">事件通知机制</span><br>&nbsp;&nbsp;&nbsp; DirectShow中的事件通知类似于Windows中的消息队列机制。各种滤波器、滤波器链表管理器等都是通过事件通知的方式和应用程序交互、通信的。比如媒体的运行、暂停或停止状态，滤波器发送相应的事件给应用程序，以便我们做相关的处理，如打开文件、显示或重启播放等。<br><span style="color: #20ff00; background-color: #020000;">检索事件</span><br>&nbsp;&nbsp;&nbsp; 滤波器链表管理器暴露了3个接口用来处理事件通知。<br>
<ul>
    <li>IMediaEventSink:滤波器用这个接口来发布事件。</li>
    <li>IMediaEvent：应用程序用这个接口来从队列中检索事件。</li>
    <li>IMediaEventEx：IMediaEvent的继承和扩展。<br></li>
</ul>
&nbsp;&nbsp;&nbsp; 滤波器都是通过调用链表管理器的IMediaEventSink::Notify方法来通知图表管理器某种事件的发生。<br>&nbsp;&nbsp;&nbsp; 应用程序通过调用图表管理器的IMediaEvent::GetEvent方法来从事件队列中获取事件。<br>&nbsp;&nbsp;&nbsp; 为了重载滤波器链表管理器对事件的默认处理，可以使用某个事件码作为参数来调用IMediaEvent::CancelDefaultHandling，这样就可以屏蔽图表管理器对某个事件友的默认处理。<br>&nbsp;&nbsp;&nbsp; 如果要恢复，则调用IMediaEvent::RestoreDefaultHandling。<br>&nbsp;&nbsp;&nbsp; 如果图表管理器没有对某个事件码默认处理，则调用这两个函数也起不了作用。<br><br><span style="color: #20ff00; background-color: #020000;">分析事件</span><br>&nbsp;&nbsp;&nbsp; 为了处理DirectShow事件，链表管理器提供了两种方法来获取正在队列中等待的事件。<br>
<ul>
    <li>窗口通知，链表管理器发送开发者自己预定义的窗口消息到应用程序窗口。</li>
    <li>事件信息，如果队列中有DirectShow事件，链表管理器就用事件信号通知应用程序，如果队列为空就重新复位事件信号。</li>
</ul>
<br><br>  <img src ="http://www.cppblog.com/GUO/aggbug/125473.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/GUO/" target="_blank">CrazyNerd</a> 2010-09-06 00:57 <a href="http://www.cppblog.com/GUO/archive/2010/09/06/125473.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>重庆市第六届程序设计大赛试题</title><link>http://www.cppblog.com/GUO/archive/2010/09/06/125964.html</link><dc:creator>CrazyNerd</dc:creator><author>CrazyNerd</author><pubDate>Sun, 05 Sep 2010 16:56:00 GMT</pubDate><guid>http://www.cppblog.com/GUO/archive/2010/09/06/125964.html</guid><wfw:comment>http://www.cppblog.com/GUO/comments/125964.html</wfw:comment><comments>http://www.cppblog.com/GUO/archive/2010/09/06/125964.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/GUO/comments/commentRss/125964.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/GUO/services/trackbacks/125964.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: v\:* {behavior:url(#default#VML);}o\:* {behavior:url(#default#VML);}w\:* {behavior:url(#default#VML);}.shape {behavior:url(#default#VML);}Normal07.8 磅02falsefalsefalse...&nbsp;&nbsp;<a href='http://www.cppblog.com/GUO/archive/2010/09/06/125964.html'>阅读全文</a><img src ="http://www.cppblog.com/GUO/aggbug/125964.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/GUO/" target="_blank">CrazyNerd</a> 2010-09-06 00:56 <a href="http://www.cppblog.com/GUO/archive/2010/09/06/125964.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]MicroMouse maze examples</title><link>http://www.cppblog.com/GUO/archive/2010/09/02/125579.html</link><dc:creator>CrazyNerd</dc:creator><author>CrazyNerd</author><pubDate>Wed, 01 Sep 2010 17:15:00 GMT</pubDate><guid>http://www.cppblog.com/GUO/archive/2010/09/02/125579.html</guid><wfw:comment>http://www.cppblog.com/GUO/comments/125579.html</wfw:comment><comments>http://www.cppblog.com/GUO/archive/2010/09/02/125579.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/GUO/comments/commentRss/125579.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/GUO/services/trackbacks/125579.html</trackback:ping><description><![CDATA[<p>原文：<a style="color: #ff0000;" target="_blank" href="http://micromouseonline.com/book/micromouse-book/mazes-and-maze-solving/examples"></a><a></a><a target="_blank" style="color: #ff0000;" href="http://micromouseonline.com/book/micromouse-book/mazes-and-maze-solving/examples">http://micromouseonline.com/book/micromouse-book/mazes-and-maze-solving/examples</a><br></p>
<p>Here are a couple of example mazes. These come from old competitions
and will give you some idea of what is going on. The numbers are
created using the flooding algorithm described on the maze solving
page. The highlighted path is the shortest route in terms of cells but
may well not be the fastest for a smart mouse.</p>
<p>It would seem that you could chart the growing sophistication of
competitive mice from the maze designs used in the competitions. For
example, when mice began to do diagonal runs, mazes started to test
that ability.</p>
<p>This maze seems to have taken little imagination to create. It comes
from the early days of the competition and was used in a competition in
the US in 1982. There seems to be little that can be done to optimise
the route beyond that highlighted. I would guess that, at the time,
most mice were concerned with the apparently simple task of running
down a corridor. A task which is fundamental to the operation of a
mouse and which is not as easy as it looks.</p>
<p class="rtecenter"><img src="http://micromouseonline.com/sites/default/files/cannock-site-images/maze_82us.gif" alt="" height="384" width="384"></p>
<p>The next maze, on the other hand, was used in Japan in 1991. You can
see several opportunities for a mouse that can run diagonally through
the maze to improve its run beyond the highlighted selection. Notice
that the diagonal improvements take just as many cells. I suppose that
is by design rather than by accident. There is also the chance for a
mouse with good straight-line speed to take a slightly longer path
around the edge of the maze. How would you know you have found the
'best' route? Your searching algorithm may well miss the fast outside
run. You should also see that some cells are inaccessible.</p>
<p>A good maze this one.</p>
<p class="rtecenter"><img src="http://micromouseonline.com/sites/default/files/cannock-site-images/maze_91japa1.gif" alt="" height="384" width="384"></p>
<p>There have been many competitions over the years and so there are a
good few examples of competition mazes. I have shown here a few more
examples with possible routes marked on them. Remember that these are
the simple flooded route and do not take into account the advantages of
different styles of turn, diagonal running etc.</p>
<p>A note of caution is in order. I have no idea if these mazes are
true representations of the actual mazes used. Other people have
collected them and there are occasional differences in the drawings
from different sources. You are also pretty well on your own when it
comes to deciding exactly where which competition is referred to. You
will need to make an educated guess from the file name.</p>
<p class="rtecenter"><strong>Japan 1983:</strong><br>
<img src="http://micromouseonline.com/sites/default/files/cannock-site-images/maze_83jap.gif" alt="" height="384" width="384"></p>
<p class="rtecenter"><strong>USA 1983:</strong><br>
<img src="http://micromouseonline.com/sites/default/files/cannock-site-images/maze_83us.gif" alt="" height="384" width="384"></p>
<p class="rtecenter"><strong>London 1992:</strong><br>
<img src="http://micromouseonline.com/sites/default/files/cannock-site-images/maze_92lon.gif" alt="" height="384" width="384"></p>
<p class="rtecenter"><strong>APEC 1993:</strong><br>
<img src="http://micromouseonline.com/sites/default/files/cannock-site-images/maze_93apec.gif" alt="" height="382" width="383"><br>
(APEC seem to specialise in hard mazes.)</p><img src ="http://www.cppblog.com/GUO/aggbug/125579.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/GUO/" target="_blank">CrazyNerd</a> 2010-09-02 01:15 <a href="http://www.cppblog.com/GUO/archive/2010/09/02/125579.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DirectShow开发基础( 二 )------简单的DirectShow程序</title><link>http://www.cppblog.com/GUO/archive/2010/08/31/125235.html</link><dc:creator>CrazyNerd</dc:creator><author>CrazyNerd</author><pubDate>Mon, 30 Aug 2010 17:00:00 GMT</pubDate><guid>http://www.cppblog.com/GUO/archive/2010/08/31/125235.html</guid><wfw:comment>http://www.cppblog.com/GUO/comments/125235.html</wfw:comment><comments>http://www.cppblog.com/GUO/archive/2010/08/31/125235.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/GUO/comments/commentRss/125235.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/GUO/services/trackbacks/125235.html</trackback:ping><description><![CDATA[编写一个DirectShow应用程序大体需要3个步骤<br>
<ol>
    <li>创建一个Filter Graph Manager的实例</li>
    <li>使用Filter Graph Manager创建一个filter graph，此时需要必备的filter</li>
    <li>使用Filter Graph Manager控制filter graph和通过这些filter的流，在这个过程中，应用程序会收到Filter Graph Manager发送的事件</li>
</ol>
&nbsp;&nbsp;<img src="http://www.cppblog.com/images/cppblog_com/guo/directshowApp.jpg" border="0"> <br>&nbsp; 完成上述几步后，最后需要释放这个Filter Graph Manager和所有的Filter资源。<br>示例(头文件和库文件已在安装vs2008时配置好了，在$(FrameworkSDKDir)include,即C:\Program Files\Microsoft SDKs\Windows\v6.0A里)： &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">stdafx.h</span><span style="color: #000000;">"</span><span style="color: #000000;"><br><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">DShow.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;">//</span><span style="color: #008000;">引入DirectShow头文件</span><span style="color: #008000;"><br></span><span style="color: #008000;">//</span><span style="color: #008000;">引入DirectShow库文件,这里采用从源程序引入，也可以配置开发环境来引入</span><span style="color: #008000;"><br></span><span style="color: #000000;"></span><span style="color: #000000;">#pragma&nbsp;comment(lib,</span><span style="color: #000000;">"</span><span style="color: #000000;">strmiids.lib</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp; </span><span style="color: #008000;"></span><span style="color: #000000;"><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;_tmain(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;argc,&nbsp;_TCHAR</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;argv[])&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;IGraphBuilder&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pGraph&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;NULL;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">图表管理器接口</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;IMediaControl&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pControl&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;NULL;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">媒体控制接口</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;IMediaEvent&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pEvent&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;NULL;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">媒体事件接口<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">初始化COM库</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;HRESULT&nbsp;hr&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;CoInitialize(NULL);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(FAILED(hr))<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">ERROR&nbsp;-&nbsp;Could&nbsp;not&nbsp;initialize&nbsp;COM&nbsp;library.</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&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;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">创建滤波器链表管理器</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC_SERVER,IID_IGraphBuilder,(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">**</span><span style="color: #000000;">)</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">pGraph);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(FAILED(hr))<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">ERROR&nbsp;-&nbsp;Could&nbsp;not&nbsp;create&nbsp;the&nbsp;Filter&nbsp;Graph&nbsp;Manager.</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&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;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">查询媒体控制和媒体事件接口</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;pGraph</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">QueryInterface(IID_IMediaControl,(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">**</span><span style="color: #000000;">)</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">pControl);<br>&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;pGraph</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">QueryInterface(IID_IMediaEvent,(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">**</span><span style="color: #000000;">)</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">pEvent);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">建立链表</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;pGraph&nbsp;</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">RenderFile(L</span><span style="color: #000000;">"</span><span style="color: #000000;">E:\\MicroMouse\\MicroMouse615走迷宫演示.WMV</span><span style="color: #000000;">"</span><span style="color: #000000;">,NULL);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(SUCCEEDED(hr))<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">运行链表</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;pControl</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">Run();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(SUCCEEDED(hr))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">等待回放结束事件</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;evCode;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">事件码</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pEvent</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">WaitForCompletion(INFINITE,</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">evCode);</span><span style="color: #008000;">//</span><span style="color: #008000;">无限时间的等待，直到媒体播放结束</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">释放所有资源和关闭COM库</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;pControl</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">Release();<br>&nbsp;&nbsp;&nbsp;&nbsp;pEvent</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">Release();<br>&nbsp;&nbsp;&nbsp;&nbsp;pGraph</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">Release();<br>&nbsp;&nbsp;&nbsp;&nbsp;CoUninitialize();<br><br>&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></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>
<br>         <img src ="http://www.cppblog.com/GUO/aggbug/125235.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/GUO/" target="_blank">CrazyNerd</a> 2010-08-31 01:00 <a href="http://www.cppblog.com/GUO/archive/2010/08/31/125235.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC++6.0里几个比较实用的插件</title><link>http://www.cppblog.com/GUO/archive/2010/08/29/125103.html</link><dc:creator>CrazyNerd</dc:creator><author>CrazyNerd</author><pubDate>Sat, 28 Aug 2010 19:04:00 GMT</pubDate><guid>http://www.cppblog.com/GUO/archive/2010/08/29/125103.html</guid><wfw:comment>http://www.cppblog.com/GUO/comments/125103.html</wfw:comment><comments>http://www.cppblog.com/GUO/archive/2010/08/29/125103.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/GUO/comments/commentRss/125103.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/GUO/services/trackbacks/125103.html</trackback:ping><description><![CDATA[智能提示插件 Whole.Tomato.Visual.Assist.X(支持vs2005/vs2008/vs2010)<br>标签插件 WndTabs<br>vc6行号插件 VC6LineNumberAddin<br><br><img style="width: 682px; height: 537px;" src="http://www.cppblog.com/images/cppblog_com/guo/vc6.jpg" border="0"><br><br>    <img src ="http://www.cppblog.com/GUO/aggbug/125103.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/GUO/" target="_blank">CrazyNerd</a> 2010-08-29 03:04 <a href="http://www.cppblog.com/GUO/archive/2010/08/29/125103.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SceneLib图形库</title><link>http://www.cppblog.com/GUO/archive/2010/08/29/125102.html</link><dc:creator>CrazyNerd</dc:creator><author>CrazyNerd</author><pubDate>Sat, 28 Aug 2010 18:35:00 GMT</pubDate><guid>http://www.cppblog.com/GUO/archive/2010/08/29/125102.html</guid><wfw:comment>http://www.cppblog.com/GUO/comments/125102.html</wfw:comment><comments>http://www.cppblog.com/GUO/archive/2010/08/29/125102.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/GUO/comments/commentRss/125102.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/GUO/services/trackbacks/125102.html</trackback:ping><description><![CDATA[SceneLib:<br><br><img src="http://www.cppblog.com/images/cppblog_com/guo/scenelib5.JPG" border="0"><br><br>C/C++的win32编程库，可以创建智能的图形窗口，以及标准的2D和基于 OpenGL的实时3D图形，不必在真实的WIN32窗口里进行任何WINDOWS编程去建立2D和3D图形.<br>如下：<br><a href="http://www.cppblog.com/Files/GUO/scenelib.JPG"></a><img src="http://www.cppblog.com/images/cppblog_com/guo/scenelib.JPG" border="0"><br><br><img src="http://www.cppblog.com/images/cppblog_com/guo/scenelib1.JPG" border="0"><br><br><img src="http://www.cppblog.com/images/cppblog_com/guo/scenelib2.JPG" border="0"><br><br><img src="http://www.cppblog.com/images/cppblog_com/guo/scenelib3.JPG" border="0"><br><br><img src="http://www.cppblog.com/images/cppblog_com/guo/scenelib4.JPG" border="0"><br><img src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/moz-screenshot.png" alt=""><br>     <img src ="http://www.cppblog.com/GUO/aggbug/125102.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/GUO/" target="_blank">CrazyNerd</a> 2010-08-29 02:35 <a href="http://www.cppblog.com/GUO/archive/2010/08/29/125102.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>UI界面设计------skin++</title><link>http://www.cppblog.com/GUO/archive/2010/08/29/125101.html</link><dc:creator>CrazyNerd</dc:creator><author>CrazyNerd</author><pubDate>Sat, 28 Aug 2010 18:19:00 GMT</pubDate><guid>http://www.cppblog.com/GUO/archive/2010/08/29/125101.html</guid><wfw:comment>http://www.cppblog.com/GUO/comments/125101.html</wfw:comment><comments>http://www.cppblog.com/GUO/archive/2010/08/29/125101.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/GUO/comments/commentRss/125101.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/GUO/services/trackbacks/125101.html</trackback:ping><description><![CDATA[具体见：http://www.uipower.com/index.php<br><br><img src="http://www.cppblog.com/images/cppblog_com/guo/skin1.jpg" border="0"><br><br>使用方法<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008000;">/*</span><span style="color: #008000;"><br>&nbsp;&nbsp; 1、将<span style="color: red;">SkinPPWTL.lib&nbsp;&nbsp;skinppwtl.dll&nbsp;SkinPPWTL.h</span>三个文件及相应皮肤拷贝至工程文件夹下<br></span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #008000;">//</span><span style="color: #008000;">2、在StdAfx.h文件中加入#include&nbsp;"SkinPPWTL.h"<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">..</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">#endif</span><span style="color: #000000;">&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;_AFX_NO_AFXCMN_SUPPORT&nbsp;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: red;">#include&nbsp;</span></span><span style="color: red;">"SkinPPWTL.h"</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">在这个地方加<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">{{AFX_INSERT_LOCATION}}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">..<br></span><span style="color: #008000;">//</span><span style="color: #008000;">3、在BOOL&nbsp;CXXApp::InitInstance()函数中加入：</span><span style="color: #008000;"><br></span><span style="color: #000000;">BOOL&nbsp;CWwApp::InitInstance()<br>{<br>&nbsp;&nbsp;&nbsp; <span style="color: red;">skinppLoadSkin(_T(</span></span><span style="color: red;">"blue.ssk"));</span><span style="color: #008000;">//</span><span style="color: #008000;">blue.ssk为项目下的皮肤文件<br></span><span style="color: #008000;">&nbsp;&nbsp;&nbsp; //</span><span style="color: #008000;">..</span><span style="color: #008000;"><br></span><span style="color: #000000;">}<br></span><span style="color: #000000;">//4</span><span style="color: #000000;">、如果是SDI</span><span style="color: #000000;">/</span><span style="color: #000000;">MDI程序，则要重载ExitInstance<br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;CWwApp::ExitInstance()&nbsp;<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;TODO:&nbsp;Add&nbsp;your&nbsp;specialized&nbsp;code&nbsp;here&nbsp;and/or&nbsp;call&nbsp;the&nbsp;base&nbsp;class</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;skinppExitSkin();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;CWinApp::ExitInstance();<br>}</span></div>
<br><br><img src="http://www.cppblog.com/images/cppblog_com/guo/skin2.jpg" border="0"><br><br><img src="http://www.cppblog.com/images/cppblog_com/guo/skin3.jpg" border="0"><br><br><img src="http://www.cppblog.com/images/cppblog_com/guo/skin4.jpg" border="0"><br>       <img src ="http://www.cppblog.com/GUO/aggbug/125101.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/GUO/" target="_blank">CrazyNerd</a> 2010-08-29 02:19 <a href="http://www.cppblog.com/GUO/archive/2010/08/29/125101.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DirectShow开发基础( 一 )------DirectShow简介</title><link>http://www.cppblog.com/GUO/archive/2010/08/29/125100.html</link><dc:creator>CrazyNerd</dc:creator><author>CrazyNerd</author><pubDate>Sat, 28 Aug 2010 17:45:00 GMT</pubDate><guid>http://www.cppblog.com/GUO/archive/2010/08/29/125100.html</guid><wfw:comment>http://www.cppblog.com/GUO/comments/125100.html</wfw:comment><comments>http://www.cppblog.com/GUO/archive/2010/08/29/125100.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/GUO/comments/commentRss/125100.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/GUO/services/trackbacks/125100.html</trackback:ping><description><![CDATA[DirectShow：我们熟悉的 DirectX家族中的一个组件，主要针对程序员开发数字音/视频程序提供支持。<br>使用DirectShow可以在很短的时间内搭建自己的视频播放、捕获和编辑应用程序，不必对有关视频硬件如显卡、视频捕获设备、视频编码算法、解码算法、音/视频数据同步等复杂技术做细节的掌握。<br>一、DirectShow SDK<br>DirectX中的一个组件，DX是Microsoft为流媒体应用开发的一套基于Windows的API。<br>DX包括:<br>
<ol>
    <li>DirectX Graphics,集成了以前的DirectDraw和Direct3D技术；</li>
    <li>DirectDraw,主要负责2D加速，以实现对显卡内存和系统内存的直接操作；</li>
    <li>DirectInput，支持输入服务（包括鼠标、键盘、游戏杆等），同时支持输出设备；</li>
    <li>DirectPlay，提供多人网络游戏的通信、组织功能；</li>
    <li>DirectSetup，提供自动安装DirectX组件的API功能；</li>
    <li>DirectMusic，支持音频的捕获、回放功能；</li>
    <li>DirectSound，提供音频捕捉、回放、音效处理、硬件加速和直接设备访问等功能；</li>
    <li>DirectShow，在Windows平台上处理各种格式的媒体文件的回放、音/视频采集、非线性编辑等高性能要求的多媒 体应用，提供了完整的解决方案；</li>
    <li>DirectX Media Objects，DirectShow Filter的简化模型，提供更方便的媒体流数据处理方案。</li>
</ol>
<br>DirectShow SDK从VC++开发人员的角度来看是SDK，更直接点讲就是静态（LIB）、动态链接库（DLL）。从计算机专业角度来讲是COM组件，使用DirectShow开发的应用程序是COM组件的客户程序。<br><br>使用DirectShow能够完成以下工作：<br>
<ul>
    <li>音/视频多媒体的捕获和预览；</li>
    <li>支持多种多媒体格式ASF、MPEG、AVI、MP3、WAVE的回放；</li>
    <li>集成其它DX技术，增强音/视频硬件如声卡、显卡的性能；</li>
    <li>视频文件的回放、非线性编辑等；</li>
    <li>支持DVD、DV等设备；</li>
    <li>定制自己的Filter。</li>
</ul>
DirectX SDK 9.0以后的版本DirectShow被移出了DX，另DirectX 9.0C SDK并不包含DirectShow SDK，而DX 9.0B SDK（2003 年发布） 则包含。<br><br>使用DirectShow SDK开发用户自己的应用程序需要几个静态链接库quartz.lib、 strmbasd.lib、 strmbase.lib、 strmiids.lib。中间两个lib需要用户自己编译生成，而其它两个Microsoft已经提供。<br>
<table style="width: 632px; height: 166px;" border="1">
    <tbody>
        <tr>
            <td style="background-color: #020000;"><span style="color: #00ff0f; background-color: #020000;">库名</span><br></td>
            <td style="color: #00ff0f;"><span style="background-color: #020000;">功能说明</span></td>
        </tr>
        <tr>
            <td valign="middle" align="left">&nbsp;strmiids.lib</td>
            <td valign="middle" align="left">&nbsp;定义了DirectShow标准的输出类标识（CLSID）和接口标识（IID）</td>
        </tr>
        <tr>
            <td valign="middle" align="left">&nbsp;strmbasd.lib</td>
            <td valign="middle" align="left">&nbsp;流媒体开发用到的库，Debug、Debug_Unicode版本</td>
        </tr>
        <tr>
            <td valign="middle" align="left">&nbsp;strmbase.lib</td>
            <td valign="middle" align="left">&nbsp;流媒体开发用到的库，Release、Release_Unicode版本</td>
        </tr>
        <tr>
            <td valign="middle" align="left">&nbsp;quartz.lib</td>
            <td valign="middle" align="left">&nbsp;定义了导出函数AMGetErrorText</td>
        </tr>
        <tr>
            <td valign="middle" align="left">&nbsp;winmm.lib</td>
            <td valign="middle" align="left">&nbsp;使用Windows多媒体编程用到的库</td>
        </tr>
    </tbody>
</table>
<br>DirectShow SDK系统框图<br><br><img src="http://www.cppblog.com/images/cppblog_com/guo/directshownote1.jpg" border="0"><br><br>&nbsp;&nbsp;&nbsp; 源过滤器主要负责从文件、网络或各种WDM/VFW驱动模式的视频捕获设备、数字照相机DC、数字摄像机DV等获取数据<br>&nbsp;&nbsp;&nbsp; 变换过滤器主要负责数据格式的转换，例如我们常说的音/视频编/解码、数据流（音频和视频）的分离或合成、特定的处理如图像增强、滤波等<br>&nbsp;&nbsp;&nbsp; 提交过滤器主要负责数据的最终流向，送到显卡显示或声卡播放，把处理结束的最后结果存储到文件当中去<br><br>基于DirectShow SDK开发的应用程序通过&#8220;命令&#8221;(command)和&#8220;事件&#8221;(event)来与DirectShow通信。用户调用DirectShow的函数对DirectShow发命令如打开文件、枚举系统设备、采集音/视频、回放数据等，DirectShow根据设备和系统的状态以事件的方式通知应用程序。<br><br>       <img src ="http://www.cppblog.com/GUO/aggbug/125100.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/GUO/" target="_blank">CrazyNerd</a> 2010-08-29 01:45 <a href="http://www.cppblog.com/GUO/archive/2010/08/29/125100.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]Force CapsLock, NumLock and ScrollLock Keys Behavior Using Windows Registry</title><link>http://www.cppblog.com/GUO/archive/2010/08/28/125011.html</link><dc:creator>CrazyNerd</dc:creator><author>CrazyNerd</author><pubDate>Sat, 28 Aug 2010 01:27:00 GMT</pubDate><guid>http://www.cppblog.com/GUO/archive/2010/08/28/125011.html</guid><wfw:comment>http://www.cppblog.com/GUO/comments/125011.html</wfw:comment><comments>http://www.cppblog.com/GUO/archive/2010/08/28/125011.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/GUO/comments/commentRss/125011.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/GUO/services/trackbacks/125011.html</trackback:ping><description><![CDATA[<p>Its a very common problem among Windows users. Whenever Windows starts, it automatically turns "<strong>CapsLock</strong>", "<strong>NumLock</strong>" or "<strong>ScrollLock</strong>" keys On at login screen even if you turned the keys off before the login or boot screen.</p>
<p>If you want to permanently change their behavior, then you can use following steps to do so:<strong></strong></p>
<p><strong>1.</strong> Type <strong>regedit</strong> in RUN dialog box and press Enter. It'll open Registry Editor.</p>
<p><strong>2.</strong> Now go to following key:</p>
<blockquote>
<p>To change the behavior for currently logged in user:<br>
<strong>HKEY_CURRENT_USER\Control Panel\Keyboard</strong></p>
<p>To change the behavior for all users:<br>
<strong> HKEY_USERS\.DEFAULT\Control Panel\Keyboard</strong></p>
</blockquote>
<p><strong>3.</strong> Now in right-side pane, change value of "<strong>InitialKeyboardIndicators</strong>" string value to any of following:</p>
<blockquote>
<p><strong>0</strong> - Turn all indicators Off (NumLock, CapsLock, ScrollLock)<br>
<strong>1</strong> - Turn CapsLock On<br>
<strong>2</strong> - Turn NumLock On<br>
<strong>3</strong> - Turn CapsLock and NumLock On<br>
<strong>4</strong> - Turn ScrollLock On<br>
<strong>5</strong> - Turn CapsLock and ScrollLock On<br>
<strong>6</strong> - Turn NumLock and ScrollLock On<br>
<strong>7</strong> - Turn all indicators On (NumLock, CapsLock, ScrollLock)</p>
</blockquote>
<p><img src="http://img.photobucket.com/albums/v374/vishaal_here/Num_Lock_on_Login_Screen.png" alt="http://img.photobucket.com/albums/v374/vishaal_here/Num_Lock_on_Login_Screen.png"></p>
<p><strong>4.</strong> That's it. Exit registry editor and restart your system to take effect.</p>
<p><br></p>
<p>原文：<a target="_blank" href="http://www.cppblog.com/GUO/admin/www.askvg.com/force-capslock-numlock-and-scrolllock-keys-behavior-using-windows-registry/">http://www.askvg.com/force-capslock-numlock-and-scrolllock-keys-behavior-using-windows-registry/</a><br></p><img src ="http://www.cppblog.com/GUO/aggbug/125011.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/GUO/" target="_blank">CrazyNerd</a> 2010-08-28 09:27 <a href="http://www.cppblog.com/GUO/archive/2010/08/28/125011.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]五种开源协议的比较(BSD,Apache,GPL,LGPL,MIT)</title><link>http://www.cppblog.com/GUO/archive/2010/08/26/124896.html</link><dc:creator>CrazyNerd</dc:creator><author>CrazyNerd</author><pubDate>Thu, 26 Aug 2010 15:29:00 GMT</pubDate><guid>http://www.cppblog.com/GUO/archive/2010/08/26/124896.html</guid><wfw:comment>http://www.cppblog.com/GUO/comments/124896.html</wfw:comment><comments>http://www.cppblog.com/GUO/archive/2010/08/26/124896.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/GUO/comments/commentRss/124896.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/GUO/services/trackbacks/124896.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们在常见的开源协议如BSD, GPL, LGPL,MIT等都是OSI批准的协议。如果要开源自己的代码，最好也是选择这些被批准的开源协议。
<p>这里我们来看四种最常用的开源协议及它们的适用范围，供那些准备开源或者使用开源产品的开发人员/厂家参考。</p>
<p><strong>BSD开源协议（</strong><a href="http://www.fsf.org/licensing/licenses/index_html#OriginalBSD"><font color="#477725">original BSD license</font></a><strong>、</strong><a id="FreeBSD" href="http://www.freebsd.org/copyright/freebsd-license.html" name="FreeBSD"><font color="#477725">FreeBSD license</font></a><strong>、</strong><a id="OriginalBSD" href="http://www.xfree86.org/3.3.6/COPYRIGHT2.html#6" name="OriginalBSD"><font color="#477725">Original BSD license</font></a><strong>）</strong></p>
<p>BSD开源协议是一个给于使用者很大自由的协议。基本上使用者可以&#8221;为所欲为&#8221;,可以自由的使用，修改源代码，也可以将修改后的代码作为开源或者专有软件再发布。</p>
<p>但&#8221;为所欲为&#8221;的前提当你发布使用了BSD协议的代码，或则以BSD协议代码为基础做二次开发自己的产品时，需要满足三个条件：</p>
<ol>
    <li>如果再发布的产品中包含源代码，则在源代码中必须带有原来代码中的BSD协议。</li>
    <li>如果再发布的只是二进制类库/软件，则需要在类库/软件的文档和版权声明中包含原来代码中的BSD协议。</li>
    <li>不可以用开源代码的作者/机构名字和原来产品的名字做市场推广。</li>
</ol>
<p>BSD 代码鼓励代码共享，但需要尊重代码作者的著作权。BSD由于允许使用者修改和重新发布代码，也允许使用或在BSD代码上开发商业软件发布和销售，因此是对商业集成很友好的协议。而很多的公司企业在选用开源产品的时候都首选BSD协议，因为可以完全控制这些第三方的代码，在必要的时候可以修改或者二次开发。</p>
<p><strong>Apache Licence 2.0（</strong><a href="http://www.apache.org/licenses/LICENSE-2.0"><font color="#477725">Apache License, Version 2.0</font></a>、<a href="http://www.apache.org/LICENSE-1.1"><font color="#477725">Apache License, Version 1.1</font></a>、<a href="http://www.apache.org/LICENSE-1.0"><font color="#477725">Apache License, Version 1.0</font></a><strong>）</strong></p>
<p>Apache Licence是著名的非盈利开源组织Apache采用的协议。该协议和BSD类似，同样鼓励代码共享和尊重原作者的著作权，同样允许代码修改，再发布（作为开源或商业软件）。需要满足的条件也和BSD类似：</p>
<ol>
    <li>需要给代码的用户一份Apache Licence</li>
    <li>如果你修改了代码，需要再被修改的文件中说明。</li>
    <li>在延伸的代码中（修改和有源代码衍生的代码中）需要带有原来代码中的协议，商标，专利声明和其他原来作者规定需要包含的说明。</li>
    <li>如果再发布的产品中包含一个Notice文件，则在Notice文件中需要带有Apache Licence。你可以在Notice中增加自己的许可，但不可以表现为对Apache Licence构成更改。</li>
</ol>
<p>Apache Licence也是对商业应用友好的许可。使用者也可以在需要的时候修改代码来满足需要并作为开源或商业产品发布/销售。</p>
<p><strong>GPL（</strong><a id="GNUGPL" href="http://www.fsf.org/licensing/licenses/gpl.html" name="GNUGPL"><font color="#477725">GNU General Public License</font></a><strong>）</strong></p>
<p>我们很熟悉的Linux就是采用了GPL。GPL协议和BSD, Apache Licence等鼓励代码重用的许可很不一样。GPL的出发点是代码的开源/免费使用和引用/修改/衍生代码的开源/免费使用，但不允许修改后和衍生的代码做为闭源的商业软件发布和销售。这也就是为什么我们能用免费的各种linux，包括商业公司的linux和linux上各种各样的由个人，组织，以及商业软件公司开发的免费软件了。</p>
<p>GPL协议的主要内容是只要在一个软件中使用(&#8220;使用&#8221;指类库引用，修改后的代码或者衍生代码)GPL 协议的产品，则该软件产品必须也采用GPL协议，既必须也是开源和免费。<strong>这就是所谓的&#8221;传染性&#8221;</strong>。GPL协议的产品作为一个单独的产品使用没有任何问题，还可以享受免费的优势。</p>
<p>由于GPL严格要求使用了GPL类库的软件产品必须使用GPL协议，对于使用GPL协议的开源代码，商业软件或者对代码有保密要求的部门就不适合集成/采用作为类库和二次开发的基础。</p>
<p>其它细节如再发布的时候需要伴随GPL协议等和BSD/Apache等类似。</p>
<p><strong>LGPL（</strong><a id="LGPL" href="http://www.fsf.org/licensing/licenses/lgpl.html" name="LGPL"><font color="#477725">GNU Lesser General Public License</font></a><strong>）</strong></p>
<p>LGPL是GPL的一个为主要为类库使用设计的开源协议。和GPL要求任何使用/修改/衍生之GPL类库的的软件必须采用GPL协议不同。LGPL允许商业软件通过类库引用(link)方式使用LGPL类库而不需要开源商业软件的代码。这使得采用LGPL协议的开源代码可以被商业软件作为类库引用并发布和销售。</p>
<p>但是如果修改LGPL协议的代码或者衍生，则所有修改的代码，涉及修改部分的额外代码和衍生的代码都必须采用LGPL协议。因此LGPL协议的开源代码很适合作为第三方类库被商业软件引用，但不适合希望以LGPL协议代码为基础，通过修改和衍生的方式做二次开发的商业软件采用。</p>
<p>GPL/LGPL都保障原作者的知识产权，避免有人利用开源代码复制并开发类似的产品</p>
<p><strong>MIT（<a href="http://www.opensource.org/licenses/mit-license.php"><font color="#477725">MIT</font></a>）</strong></p>
<p>MIT是和BSD一样宽范的许可协议,作者只想保留版权,而无任何其他了限制.也就是说,你必须在你的发行版里包含原许可协议的声明,无论你是以二进制发布的还是以源代码发布的.</p><img src ="http://www.cppblog.com/GUO/aggbug/124896.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/GUO/" target="_blank">CrazyNerd</a> 2010-08-26 23:29 <a href="http://www.cppblog.com/GUO/archive/2010/08/26/124896.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]22 Neat Code Editors for Windows </title><link>http://www.cppblog.com/GUO/archive/2010/08/26/124894.html</link><dc:creator>CrazyNerd</dc:creator><author>CrazyNerd</author><pubDate>Thu, 26 Aug 2010 14:57:00 GMT</pubDate><guid>http://www.cppblog.com/GUO/archive/2010/08/26/124894.html</guid><wfw:comment>http://www.cppblog.com/GUO/comments/124894.html</wfw:comment><comments>http://www.cppblog.com/GUO/archive/2010/08/26/124894.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/GUO/comments/commentRss/124894.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/GUO/services/trackbacks/124894.html</trackback:ping><description><![CDATA[<p>Code editors for Windows are numerous, but it seems that only a few of them are really worth using. After all, it can take a while to really get into the groove of an editor and tweak all the settings to your tastes, so you&#8217;d better find one you like! </p>
<p><span id="more-5104"></span></p>
<div class="tutorial_image"><img alt="Windows text editors" src="http://nettuts.s3.amazonaws.com/333_editors/roundup.png" loaded="true" original="http://nettuts.s3.amazonaws.com/333_editors/roundup.png"></div>
<p>I should mention that the features I&#8217;ve called out for each editor are only the prominent ones; obviously, there are many more. Also, just because I&#8217;ve mentioned a feature on one editor and not another doesn&#8217;t mean the second one doesn&#8217;t have the feature. So let&#8217;s get to it! I&#8217;ve arranged them from least to most expensive.</p>
<h3>Notepad++</h3>
<div class="tutorial_image"><img alt="Notepad++" src="http://nettuts.s3.amazonaws.com/333_editors/notepadPlus.png" loaded="true" original="http://nettuts.s3.amazonaws.com/333_editors/notepadPlus.png"></div>
<ul>
    <li><a href="http://notepad-plus.sourceforge.net/"><u><font color="#276056">http://notepad-plus.sourceforge.net</font></u></a>
    </li>
    <li>v 5.3.2 | Free </li>
</ul>
<p>This is probably the best free text editor for Windows out there; with support for simple things—like syntax highlighting and folding—all the way up to FTP, Notepad++ should tick most of the boxes. I&#8217;ve used the editor as my main editor quite a bit, and one of my favourite features is File Status Auto-detection: when NP++ is made the active program, it will check all currently open files for changes and let you know if any file has been updated / deleted. Notepad++ is based on the Scintilla editing component.</p>
<h3>JEdit</h3>
<div class="tutorial_image"><img style="display: inline;" alt="JEdit" src="http://nettuts.s3.amazonaws.com/333_editors/jedit.png" jquery1282834085614="271" loaded="true" original="http://nettuts.s3.amazonaws.com/333_editors/jedit.png"></div>
<ul>
    <li><a href="http://jedit.org/"><u><font color="#276056">http://jedit.org</font></u></a>
    </li>
    <li>v 4.20 | Free </li>
</ul>
<p>Jedit is rather ugly in my opinion, but it has a decent feature set; as a Java program, it&#8217;s actually multi-platform. It offers syntax highlighting for over 130 languages. The website says it supports folding, but I couldn&#8217;t get that to work (although it does highlight the opposite bracket). Jedit has a plugin repository, which may give the editor a bit more functionality.</p>
<h3>Notepad2</h3>
<div class="tutorial_image"><img style="display: inline;" alt="Notepad2" src="http://nettuts.s3.amazonaws.com/333_editors/notepad2.png" jquery1282834085614="369" loaded="true" original="http://nettuts.s3.amazonaws.com/333_editors/notepad2.png"></div>
<ul>
    <li><a href="http://www.flos-freeware.ch/notepad2.html"><u><font color="#276056">http://www.flos-freeware.ch/notepad2.html</font></u></a>
    </li>
    <li>v 3.0.20 | Free </li>
</ul>
<p>Notepad2 is also based on the Scintilla editing engine, but it&#8217;s much simpler than Notepad++. It bills itself as being fast, light-weight, and Notepad-like, and offers syntax highlighting for a variety of languages. There&#8217;s no installation for this editor: just unzip and run. There are a few modified versions (with more features / languages) available.</p>
<h3>Programmer&#8217;s Notepad</h3>
<div class="tutorial_image"><img style="display: inline;" alt="Programmer's notepad" src="http://nettuts.s3.amazonaws.com/333_editors/programmers_notepad.png" jquery1282834085614="515" loaded="true" original="http://nettuts.s3.amazonaws.com/333_editors/programmers_notepad.png"></div>
<ul>
    <li><a href="http://pnotepad.org/"><u><font color="#276056">http://pnotepad.org</font></u></a>
    </li>
    <li>v 2 0.9.926 | Free </li>
</ul>
<p>Programmer&#8217;s Notepad has a similar interface to that of Notepad2, although it does support having multiple files open at once. It supports bookmarking, folding, and highlighting, but other than that, there isn&#8217;t too much to mention.</p>
<h3>Crimson Editor</h3>
<div class="tutorial_image"><img style="display: inline;" alt="Crimson editor" src="http://nettuts.s3.amazonaws.com/333_editors/crimson_editor.png" jquery1282834085614="2234" loaded="true" original="http://nettuts.s3.amazonaws.com/333_editors/crimson_editor.png"></div>
<ul>
    <li><a href="http://www.crimsoneditor.com/"><u><font color="#276056">http://www.crimsoneditor.com/</font></u></a>
    </li>
    <li>v 3.7 | Free </li>
</ul>
<p>Crimson Editor offers macro support and the ability to execute external programs. It has the ability to edit remote files, using a built-in FTP client; there&#8217;s also a spell checker and a neat &#8216;column select&#8217; mode.</p>
<h3>ConTEXT</h3>
<div class="tutorial_image"><img style="display: inline;" alt="ConTEXT" src="http://nettuts.s3.amazonaws.com/333_editors/context.png" jquery1282834085614="974" loaded="true" original="http://nettuts.s3.amazonaws.com/333_editors/context.png"></div>
<ul>
    <li><a href="http://www.contexteditor.org/"><u><font color="#276056">http://www.contexteditor.org/</font></u></a>
    </li>
    <li>v 0.98.5 | Free </li>
</ul>
<p>ConTEXT supports many languages, both programming and human; it also gives you the ability to define your own custom languages. It does file comparing and exporting to HTML, and includes some interesting behaviour for projects. Another neat thing: ConTEXT remembers where your cursor is when you close a file, and puts it back there when you re-open the file.</p>
<h3>SciTE</h3>
<div class="tutorial_image"><img style="display: inline;" alt="SciTE" src="http://nettuts.s3.amazonaws.com/333_editors/scite.png" jquery1282834085614="1588" loaded="true" original="http://nettuts.s3.amazonaws.com/333_editors/scite.png"></div>
<ul>
    <li><a href="http://gisdeveloper.tripod.com/scite.html"><u><font color="#276056">http://gisdeveloper.tripod.com/scite.html</font></u></a>
    </li>
    <li>v 1.77 | Free </li>
</ul>
<p>SciTE is a really simple text editor, based on Scintilla. It&#8217;s quite basic, but it does support syntax highlighting for around 30 languages and regular expression search and replace.</p>
<h3>Editra</h3>
<div class="tutorial_image"><img style="display: inline;" alt="Editra" src="http://nettuts.s3.amazonaws.com/333_editors/editra.png" jquery1282834085614="1614" loaded="true" original="http://nettuts.s3.amazonaws.com/333_editors/editra.png"></div>
<ul>
    <li><a href="http://editra.org/"><u><font color="#276056">http://editra.org/</font></u></a>
    </li>
    <li>v 0.4.88 | Free </li>
</ul>
<p>Editra claims to be in the early stages of development, but it offers a decent bunch of features: user profiles, auto-completion, session saving, and syntax highlighing for 60+ languages. Plugins can extend the feature set, offering an integrated python console, FTP client, file browser, and calculator, among others. </p>
<h3>PSPad</h3>
<div class="tutorial_image"><img style="display: inline;" alt="PSPad" src="http://nettuts.s3.amazonaws.com/333_editors/pspad.png" jquery1282834085614="1652" loaded="true" original="http://nettuts.s3.amazonaws.com/333_editors/pspad.png"></div>
<ul>
    <li><a href="http://www.pspad.com/en/"><u><font color="#276056">http://www.pspad.com/en/</font></u></a>
    </li>
    <li>v 4.5.3 | Free </li>
</ul>
<p>PSPad brings templates, an interesting internal web browser, and a macro recorder to the table. It also supports hex editing, and some degree of code compiling. PSPad offers integration with TopStyle Lite, which may come in handy if you use it for writing CSS.</p>
<h3>RJ TextEd</h3>
<div class="tutorial_image"><img style="display: inline;" alt="RJ texted" src="http://nettuts.s3.amazonaws.com/333_editors/rj_texted.png" jquery1282834085614="3443" loaded="true" original="http://nettuts.s3.amazonaws.com/333_editors/rj_texted.png"></div>
<ul>
    <li><a href="http://www.rj-texted.se/"><u><font color="#276056">http://www.rj-texted.se/</font></u></a>
    </li>
    <li>v 5.10 | Free </li>
</ul>
<p>RJ TextED, too, offers integration with TopStyle Lite; and it does HTML validation and formatting. It sports an FTP client, a file browser, and a code browser, as well as a character map and support for email.</p>
<h3>SourceEdit</h3>
<div class="tutorial_image"><img style="display: inline;" alt="SourceEdit" src="http://nettuts.s3.amazonaws.com/333_editors/sourceedit.png" jquery1282834085614="3435" loaded="true" original="http://nettuts.s3.amazonaws.com/333_editors/sourceedit.png"></div>
<ul>
    <li><a href="http://www.brixoft.net/prodinfo.asp?id=1"><u><font color="#276056">http://www.brixoft.net/prodinfo.asp?id=1</font></u></a>
    </li>
    <li>v 4 | Free </li>
</ul>
<p>SourceEdit includes features such as clipboard history, syntax highlighting and autocompletion for a decent set of languages. A hex editor and FTP client beef this one up a bit, too. Oh, and it does macros, too.</p>
<h3>TotalEdit</h3>
<div class="tutorial_image"><img style="display: inline;" alt="TotalEdit" src="http://nettuts.s3.amazonaws.com/333_editors/totaledit.png" jquery1282834085614="2915" loaded="true" original="http://nettuts.s3.amazonaws.com/333_editors/totaledit.png"></div>
<ul>
    <li><a href="http://www.codertools.com/totaledit.aspx"><u><font color="#276056">http://www.codertools.com/totaledit.aspx</font></u></a>
    </li>
    <li>v 5.2 | Free </li>
</ul>
<p>TotalEdit does file comparison, RegEx search and replace, and has multiple options for file backup / versioning. For cleanup, it offers (X)HTML and XML customizable formatting, and a spell checker. You can install TotalEdit on a USB drive, making it portable, if you want; you can also easily send the current document as an email.</p>
<h3>Emacs</h3>
<div class="tutorial_image"><img style="display: inline;" alt="Emacs" src="http://nettuts.s3.amazonaws.com/333_editors/emacs.png" jquery1282834085614="2101" loaded="true" original="http://nettuts.s3.amazonaws.com/333_editors/emacs.png"></div>
<ul>
    <li><a href="http://www.gnu.org/software/emacs/"><u><font color="#276056">http://www.gnu.org/software/emacs/</font></u></a>
    </li>
    <li>v 22.3 | Free </li>
</ul>
<blockquote>
<p>&#8220;Beyond just being able to edit plain text files, Emacs includes special features to help you write in many different programming and markup language. Emacs can compare two files and highlight their differences. Emacs is a file manager. Emacs can read news, mail, and RSS feeds. You can even play tetris in Emacs. You might see now why some people consider Emacs to be not merely a text editor but almost a complete operating system. Some users find that they can do almost all of their work from within Emacs.&#8221; <script type="text/javascript"><!--
google_ad_client = "pub-9093712935949486";
/* 300x250 nettuts middle tutsads */
google_ad_slot =" "1775681443";
google_ad_width" = 300;
google_ad_height =" 250;
//--">
</script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script><script src="http://pagead2.googlesyndication.com/pagead/expansion_embed.js"></script><script src="http://googleads.g.doubleclick.net/pagead/test_domain.js"></script><script src="http://pagead2.googlesyndication.com/pagead/render_ads.js"></script><script>google_protectAndRun("render_ads.js::google_render_ad", google_handleError, google_render_ad);</script></p>
</blockquote>
<h3>Vim</h3>
<div class="tutorial_image"><img style="display: inline;" alt="Vim" src="http://nettuts.s3.amazonaws.com/333_editors/vim.png" jquery1282834085614="3439" loaded="true" original="http://nettuts.s3.amazonaws.com/333_editors/vim.png"></div>
<ul>
    <li><a href="http://www.vim.org/"><u><font color="#276056">http://www.vim.org/</font></u></a>
    </li>
    <li>v 7.2 | Free </li>
</ul>
<p>Vim is an incredibly complex text editor, more similar to Emacs than any others on our list (although Vim and Emacs users seem to be <a href="http://en.wikipedia.org/wiki/Editor_war"><u><font color="#276056">somewhat at odds</font></u></a> ). I don&#8217;t think I could do it justice in a few sentences, considering that there have been whole volumes written on it (not to mention that I have only a cursory knowledge of Vim). Suffice it to say that Vim probably has every feature mentioned in this article, and a few hundred more. For starters, check out <a href="http://www.vim.org/6k/features.en.txt"><u><font color="#276056">&#8220;Vim in 6K&#8221;</font></u></a> </p>
<h3>Bespin</h3>
<div class="tutorial_image"><img style="display: inline;" alt="Bespin" src="http://nettuts.s3.amazonaws.com/333_editors/bespin.png" jquery1282834085614="3437" loaded="true" original="http://nettuts.s3.amazonaws.com/333_editors/bespin.png"></div>
<ul>
    <li><a href="http://bespin.mozilla.com/"><u><font color="#276056">http://bespin.mozilla.com</font></u></a>
    </li>
    <li>v 0.2.2 | Free </li>
</ul>
<p>I know Bespin isn&#8217;t really a Windows text editor, and it hardly has the feature set that other editors do, but I thought I&#8217;d throw it into the mix just because I really like the concept of an online text editor and because it has one big (obvious) feature that the rest don&#8217;t: cloud access to your code. It also offers syntax highlighting for HTML, CSS and JavaScript.</p>
<h3>Textpad</h3>
<div class="tutorial_image"><img style="display: inline;" alt="Textpad" src="http://nettuts.s3.amazonaws.com/333_editors/textpad.png" jquery1282834085614="3441" loaded="true" original="http://nettuts.s3.amazonaws.com/333_editors/textpad.png"></div>
<ul>
    <li><a href="http://www.textpad.com/products/textpad/index.html"><u><font color="#276056">http://www.textpad.com/products/textpad/index.html</font></u></a>
    </li>
    <li>v 5.2.0 | $24.70 </li>
</ul>
<p>TextPad is a rather simplistic editor: it boasts column select, drag-and-drop text between files, and hyperlink support. It also supports large files (based on the size of your virtual memory). That&#8217;s it? Well, the feature list also mentions a right-click menu.</p>
<h3>E-Text Editor</h3>
<div class="tutorial_image"><img style="display: inline;" alt="E-Text editor" src="http://nettuts.s3.amazonaws.com/333_editors/e-text_editor.png" jquery1282834085614="4004" loaded="true" original="http://nettuts.s3.amazonaws.com/333_editors/e-text_editor.png"></div>
<ul>
    <li><a href="http://www.e-texteditor.com/"><u><font color="#276056">http://www.e-texteditor.com/</font></u></a>
    </li>
    <li>v 1.0.30 | $34.96 </li>
</ul>
<p>This is one of the most interesting editors, mainly because of the &#8216;foreign&#8217; features it brings to Windows: </p>
<blockquote>
<p>&#8220;Close integration with cygwin [a Linux-like environment for Windows] gives you access to the full range of UNIX shell tools and lets you extend e with your choice of languages like Ruby, Perl, Python and more.&#8221;</p>
</blockquote>
<p>Another one of e&#8217;s strong points is that it accepts TextMate bundles; it also supports revision control, so you don&#8217;t have to keep track of multiples versions of a file.</p>
<h3>In-Type</h3>
<div class="tutorial_image"><img style="display: inline;" alt="In-Type" src="http://nettuts.s3.amazonaws.com/333_editors/intype.png" jquery1282834085614="3447" loaded="true" original="http://nettuts.s3.amazonaws.com/333_editors/intype.png"></div>
<ul>
    <li><a href="http://intype.info/"><u><font color="#276056">http://intype.info</font></u></a>
    </li>
    <li>v 03.x (alpha) | currently free, to be ~ $25 &#8211; $45 </li>
</ul>
<p>Intype is a pretty neat little editor that&#8217;s still in development. It currently doesn&#8217;t have a whole lot of features (you can&#8217;t even drag and drop text), but it looks like it will be pretty slick. It does snippets really well, and already offers a pretty wide selection, as well as supporting about two dozen languages (with support for creating additional ones). Keep an eye on this one; it&#8217;s promising.</p>
<h3>EditPlus</h3>
<div class="tutorial_image"><img style="display: inline;" alt="EditPlus" src="http://nettuts.s3.amazonaws.com/333_editors/editplus.png" jquery1282834085614="3445" loaded="true" original="http://nettuts.s3.amazonaws.com/333_editors/editplus.png"></div>
<ul>
    <li><a href="http://www.editplus.com/"><u><font color="#276056">http://www.editplus.com/</font></u></a>
    </li>
    <li>v 3.10 | $35.00 </li>
</ul>
<p>EditPlus doesn&#8217;t have anything unique, but there are some niceties: it highlights URLs and email addresses, activating them when you &#8216;crtl + double-click&#8217;. It also has a built in browser for previewing HTML, and FTP and SFTP support. Macros and RegEx find and replace are good to have as well.</p>
<h3>HippoEDIT</h3>
<div class="tutorial_image"><img style="display: inline;" alt="HippoEDIT" src="http://nettuts.s3.amazonaws.com/333_editors/hippoedit.png" jquery1282834085614="3462" loaded="true" original="http://nettuts.s3.amazonaws.com/333_editors/hippoedit.png"></div>
<ul>
    <li><a href="http://www.hippoedit.com/"><u><font color="#276056">http://www.hippoedit.com</font></u></a>
    </li>
    <li>v 1.42 | $39.95 </li>
</ul>
<p>HippoEDIT offers something a bit different when it comes to autocomplete: in pops a &#8216;tooltip&#8217; above your cursor as you type, suggesting words you&#8217;ve already typed. It does syntax highlighting for over 2 dozen languages, and includes code templates for many of those languages. HippoEDIT also has customizable keyboard shortcuts and workspace layouts.</p>
<h3>UltraEdit</h3>
<div class="tutorial_image"><img style="display: inline;" alt="UltraEdit" src="http://nettuts.s3.amazonaws.com/333_editors/ultraedit.png" jquery1282834085614="4006" loaded="true" original="http://nettuts.s3.amazonaws.com/333_editors/ultraedit.png"></div>
<ul>
    <li><a href="http://www.ultraedit.com/products/ultraedit.html"><u><font color="#276056">http://www.ultraedit.com/products/ultraedit.html</font></u></a>
    </li>
    <li>v 15. | $49.95 </li>
</ul>
<p>UltraEdit almost seems more like an IDE than a text editor; there are hundreds (easily thousands) of features packed into this one. Obviously reaching out to more than just web developers, UltraEdit is ultra-customizable, with different &#8216;environments&#8217; to choose from, depending on what job you&#8217;re doing. Supposedly &#8220;nearly every editing task&#8221; is automatable. UltraEdit also supports FTP and has a built-in SSH/telnet console for accessing your servers. </p>
<h3>Sublime Text</h3>
<div class="tutorial_image"><img style="display: inline;" alt="Sublime text" src="http://nettuts.s3.amazonaws.com/333_editors/sublime_text.png" jquery1282834085614="3449" loaded="true" original="http://nettuts.s3.amazonaws.com/333_editors/sublime_text.png"></div>
<ul>
    <li><a href="http://www.sublimetext.com/"><u><font color="#276056">http://www.sublimetext.com</font></u></a>
    </li>
    <li>v 1.05 | $59.00 </li>
</ul>
<p>Sublime Text is probably one of the most fun editors that I looked at, mainly because of its super-cool &#8216;zoomed out&#8217; view of the file that you can pan around on. One drawback is that the preferences dialog is really just a bunch of text files; this can make it a bit difficult to tweak settings if you don&#8217;t know exactly what you&#8217;re looking for. I like the option to open a local file when you right-click on its link, and there are a few automation features, so this would make a solid choice of a text editor.</p>
<h3>Extras</h3>
<p>While reseaching for this article, I found a few other related things. First off, text editors are good for more than coding: they provide an excellent environment for writing content. To that end, you might want to check out <a href="http://www.writemonkey.com/"><u><font color="#276056">WriteMonkey</font></u></a>, <a href="http://www.baara.com/q10/"><u><font color="#276056">Q10</font></u></a>, or <a href="http://they.misled.us/dark-room"><u><font color="#276056">DarkRoom</font></u></a>. These editors aren&#8217;t very good for coding, but are great for writing copy with minimal distractions.</p>
<p>Then, for some interesting tips on text editing, check out the video <a href="http://video.google.com/videoplay?docid=2538831956647446078"><u><font color="#276056">&#8220;Seven Habits for effective Text Editing 2.0&#8243;</font></u></a> by the creator of Vim. </p>
<h3>That&#8217;s it!</h3>
<p>I&#8217;d love to hear what text editor you use, and why; chances are, I missed a few good ones. Let me know in the comments!</p>
<ul class="webroundup">
    <li>Follow us on <a href="http://www.twitter.com/nettuts"><u><font color="#276056">Twitter</font></u></a>, or subscribe to the <a title="NETTUTS rss feed" href="http://feeds.feedburner.com/nettuts"><u><font color="#276056">NETTUTS RSS Feed</font></u></a> for more daily web development tuts and articles. </li>
</ul>
<p><script type="text/javascript"><!--digg_url = "post permalink (not digg url)"; // -->
</script><br><script type="text/javascript" src="http://digg.com/tools/diggthis.js"></script></p><img src ="http://www.cppblog.com/GUO/aggbug/124894.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/GUO/" target="_blank">CrazyNerd</a> 2010-08-26 22:57 <a href="http://www.cppblog.com/GUO/archive/2010/08/26/124894.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>注册表</title><link>http://www.cppblog.com/GUO/archive/2010/06/01/116911.html</link><dc:creator>CrazyNerd</dc:creator><author>CrazyNerd</author><pubDate>Tue, 01 Jun 2010 09:03:00 GMT</pubDate><guid>http://www.cppblog.com/GUO/archive/2010/06/01/116911.html</guid><wfw:comment>http://www.cppblog.com/GUO/comments/116911.html</wfw:comment><comments>http://www.cppblog.com/GUO/archive/2010/06/01/116911.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/GUO/comments/commentRss/116911.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/GUO/services/trackbacks/116911.html</trackback:ping><description><![CDATA[利用Win32API函数操作注册表：<br><br>MFC对话框工程：SoftReg，将应用软件的使用次数写入注册表。<br>在OnInitDialog函数中添加：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; width: 98%; font-size: 13px;"><img id="Codehighlighter1_0_73_Open_Image" onclick="this.style.display='none'; codehighlighter1_0_73_open_text.style.display="'none';" codehighlighter1_0_73_closed_image.style.display="'inline';" codehighlighter1_0_73_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img style="display: none;" id="Codehighlighter1_0_73_Closed_Image" onclick="this.style.display='none'; codehighlighter1_0_73_closed_text.style.display="'none';" codehighlighter1_0_73_open_image.style.display="'inline';" codehighlighter1_0_73_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"><span style="border: 1px solid #808080; background-color: #ffffff; display: none;" id="Codehighlighter1_0_73_Closed_Text">/**/</span><span id="Codehighlighter1_0_73_Open_Text"><span style="color: #008000;">/*</span><span style="color: #008000;">**********************************************************************</span><span style="color: #008000;">*/</span></span><span style="color: #000000;"><br><img id="Codehighlighter1_76_221_Open_Image" onclick="this.style.display='none'; codehighlighter1_76_221_open_text.style.display="'none';" codehighlighter1_76_221_closed_image.style.display="'inline';" codehighlighter1_76_221_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img style="display: none;" id="Codehighlighter1_76_221_Closed_Image" onclick="this.style.display='none'; codehighlighter1_76_221_closed_text.style.display="'none';" codehighlighter1_76_221_open_image.style.display="'inline';" codehighlighter1_76_221_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border: 1px solid #808080; background-color: #ffffff; display: none;" id="Codehighlighter1_76_221_Closed_Text">/**/</span><span id="Codehighlighter1_76_221_Open_Text"><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;RegOpenKey(HKEY&nbsp;hKey,LPCTSRT&nbsp;lpSubKey,PHKEY&nbsp;phkResult)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;打开注册表中指定的项或子项,hKey：根键，lpSubKey：将要打开的子项名称，<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;phkResult:返回打开的子项。如果成功，返回ERROR_SUCCESS<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span></span><span style="color: #000000;"><br><img id="Codehighlighter1_224_297_Open_Image" onclick="this.style.display='none'; codehighlighter1_224_297_open_text.style.display="'none';" codehighlighter1_224_297_closed_image.style.display="'inline';" codehighlighter1_224_297_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img style="display: none;" id="Codehighlighter1_224_297_Closed_Image" onclick="this.style.display='none'; codehighlighter1_224_297_closed_text.style.display="'none';" codehighlighter1_224_297_open_image.style.display="'inline';" codehighlighter1_224_297_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border: 1px solid #808080; background-color: #ffffff; display: none;" id="Codehighlighter1_224_297_Closed_Text">/**/</span><span id="Codehighlighter1_224_297_Open_Text"><span style="color: #008000;">/*</span><span style="color: #008000;">**********************************************************************</span><span style="color: #008000;">*/</span></span><span style="color: #000000;"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;HKEY&nbsp;Key;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;CString&nbsp;sKeyPath;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;sKeyPath&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Software\\jerry</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(RegOpenKey(HKEY_CURRENT_USER,sKeyPath,</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">Key)</span><span style="color: #000000;">!=</span><span style="color: #000000;">0</span><span style="color: #000000;"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;RegOpenKey(HKEY_CURRENT_USER,sKeyPath,</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">Key)</span><span style="color: #000000;">!=</span><span style="color: #000000;">ERROR_SUCCESS)<br><img id="Codehighlighter1_481_696_Open_Image" onclick="this.style.display='none'; codehighlighter1_481_696_open_text.style.display="'none';" codehighlighter1_481_696_closed_image.style.display="'inline';" codehighlighter1_481_696_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img style="display: none;" id="Codehighlighter1_481_696_Closed_Image" onclick="this.style.display='none'; codehighlighter1_481_696_closed_text.style.display="'none';" codehighlighter1_481_696_open_image.style.display="'inline';" codehighlighter1_481_696_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border: 1px solid #808080; background-color: #ffffff; display: none;" id="Codehighlighter1_481_696_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_481_696_Open_Text"><span style="color: #000000;">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::RegCreateKey(HKEY_CURRENT_USER,sKeyPath,</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">Key);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::RegSetValueEx(Key,</span><span style="color: #000000;">"</span><span style="color: #000000;">TryTime</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">0</span><span style="color: #000000;">,REG_SZ,(unsigned&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">)</span><span style="color: #000000;">"</span><span style="color: #000000;">5</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">2</span><span style="color: #000000;">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::RegCloseKey(Key);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(</span><span style="color: #000000;">"</span><span style="color: #000000;">You&nbsp;can&nbsp;try&nbsp;this&nbsp;5&nbsp;times!</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">tip</span><span style="color: #000000;">"</span><span style="color: #000000;">,MB_OK</span><span style="color: #000000;">|</span><span style="color: #000000;">MB_ICONEXCLAMATION);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;">&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br><img id="Codehighlighter1_706_1288_Open_Image" onclick="this.style.display='none'; codehighlighter1_706_1288_open_text.style.display="'none';" codehighlighter1_706_1288_closed_image.style.display="'inline';" codehighlighter1_706_1288_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img style="display: none;" id="Codehighlighter1_706_1288_Closed_Image" onclick="this.style.display='none'; codehighlighter1_706_1288_closed_text.style.display="'none';" codehighlighter1_706_1288_open_image.style.display="'inline';" codehighlighter1_706_1288_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border: 1px solid #808080; background-color: #ffffff; display: none;" id="Codehighlighter1_706_1288_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_706_1288_Open_Text"><span style="color: #000000;">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CString&nbsp;sKeyTime;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;nTryTime;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LPBYTE&nbsp;Data</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;BYTE[</span><span style="color: #000000;">80</span><span style="color: #000000;">];<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;TYPE</span><span style="color: #000000;">=</span><span style="color: #000000;">REG_SZ;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;cbData</span><span style="color: #000000;">=</span><span style="color: #000000;">80</span><span style="color: #000000;">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::RegQueryValueEx(Key,</span><span style="color: #000000;">"</span><span style="color: #000000;">TryTime</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;">&amp;</span><span style="color: #000000;">TYPE,Data,</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">cbData);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sKeyTime.Format(</span><span style="color: #000000;">"</span><span style="color: #000000;">%s</span><span style="color: #000000;">"</span><span style="color: #000000;">,Data);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nTryTime</span><span style="color: #000000;">=</span><span style="color: #000000;">atoi(sKeyTime);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(nTryTime&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)<br><img id="Codehighlighter1_949_1027_Open_Image" onclick="this.style.display='none'; codehighlighter1_949_1027_open_text.style.display="'none';" codehighlighter1_949_1027_closed_image.style.display="'inline';" codehighlighter1_949_1027_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img style="display: none;" id="Codehighlighter1_949_1027_Closed_Image" onclick="this.style.display='none'; codehighlighter1_949_1027_closed_text.style.display="'none';" codehighlighter1_949_1027_open_image.style.display="'inline';" codehighlighter1_949_1027_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border: 1px solid #808080; background-color: #ffffff; display: none;" id="Codehighlighter1_949_1027_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_949_1027_Open_Text"><span style="color: #000000;">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(</span><span style="color: #000000;">"</span><span style="color: #000000;">Please&nbsp;regist!</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">tip</span><span style="color: #000000;">"</span><span style="color: #000000;">,MB_OK</span><span style="color: #000000;">|</span><span style="color: #000000;">MB_ICONSTOP);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;FALSE;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nTryTime</span><span style="color: #000000;">--</span><span style="color: #000000;">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sKeyTime.Format(</span><span style="color: #000000;">"</span><span style="color: #000000;">%d</span><span style="color: #000000;">"</span><span style="color: #000000;">,nTryTime);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::RegSetValueEx(Key,</span><span style="color: #000000;">"</span><span style="color: #000000;">TryTime</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">0</span><span style="color: #000000;">,REG_SZ,(unsigned&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">)sKeyTime.GetBuffer(sKeyTime.GetLength()),</span><span style="color: #000000;">2</span><span style="color: #000000;">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::RegCloseKey(Key);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(</span><span style="color: #000000;">"</span><span style="color: #000000;">You&nbsp;can&nbsp;try&nbsp;this&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">sKeyTime</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;times!</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;tip</span><span style="color: #000000;">"</span><span style="color: #000000;">,MB_OK</span><span style="color: #000000;">|</span><span style="color: #000000;">MB_ICONEXCLAMATION);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div><img src ="http://www.cppblog.com/GUO/aggbug/116911.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/GUO/" target="_blank">CrazyNerd</a> 2010-06-01 17:03 <a href="http://www.cppblog.com/GUO/archive/2010/06/01/116911.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>INI文件</title><link>http://www.cppblog.com/GUO/archive/2010/06/01/116906.html</link><dc:creator>CrazyNerd</dc:creator><author>CrazyNerd</author><pubDate>Tue, 01 Jun 2010 08:15:00 GMT</pubDate><guid>http://www.cppblog.com/GUO/archive/2010/06/01/116906.html</guid><wfw:comment>http://www.cppblog.com/GUO/comments/116906.html</wfw:comment><comments>http://www.cppblog.com/GUO/archive/2010/06/01/116906.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/GUO/comments/commentRss/116906.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/GUO/services/trackbacks/116906.html</trackback:ping><description><![CDATA[<p>利用Windows系统提供的对.ini文件操作的API函数：<br><br>WritePrivateProfileString&nbsp;&nbsp;&nbsp;向.ini文件中写入指定节、指定键名的字符串信息<br>WritePrivateProfileSection<br>WritePrivateProfileStruct<br>GetPrivateProfileString&nbsp;&nbsp;&nbsp;从.ini文件中获取指定节、指定键名的字符串信息<br>GetPrivateProfileInt<br>GetPrivateProfileSection<br>GetPrivateProfileSectionNames<br>GetPrivateProfileStruct<br><br>&nbsp;MFC对话框工程 ，命名为PrivateString<br></p>
添加控件如下：<br><img border=0 src="http://www.cppblog.com/images/cppblog_com/guo/PrivateString1.png"><br>在OnInitDialog函数里添加如下代码，在程序开始运行时生成一个.ini文件，先在OnInitDialog定义前声明一个char buf[256]，用来保存list.ini的绝对路径：<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">::GetCurrentDirectory(</span><span style="COLOR: #000000">256</span><span style="COLOR: #000000">,buf);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;strcat(buf,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\\list.ini</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;HANDLE&nbsp;handle</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">CreateFile(buf,GENERIC_READ</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(handle</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">NULL)<br><img style="DISPLAY: inline" id=Codehighlighter1_203_229_Open_Image onclick="this.style.display='none'; Codehighlighter1_203_229_Open_Text.style.display='none'; Codehighlighter1_203_229_Closed_Image.style.display='inline'; Codehighlighter1_203_229_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_203_229_Closed_Image onclick="this.style.display='none'; Codehighlighter1_203_229_Closed_Text.style.display='none'; Codehighlighter1_203_229_Open_Image.style.display='inline'; Codehighlighter1_203_229_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_203_229_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span style="DISPLAY: inline" id=Codehighlighter1_203_229_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(handle);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<br>实现按钮事件：<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;CPrivateStringDlg::OnButton1()&nbsp;<br><img style="DISPLAY: inline" id=Codehighlighter1_37_332_Open_Image onclick="this.style.display='none'; Codehighlighter1_37_332_Open_Text.style.display='none'; Codehighlighter1_37_332_Closed_Image.style.display='inline'; Codehighlighter1_37_332_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_37_332_Closed_Image onclick="this.style.display='none'; Codehighlighter1_37_332_Closed_Text.style.display='none'; Codehighlighter1_37_332_Open_Image.style.display='inline'; Codehighlighter1_37_332_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_37_332_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span style="DISPLAY: inline" id=Codehighlighter1_37_332_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;TODO:&nbsp;Add&nbsp;your&nbsp;control&nbsp;notification&nbsp;handler&nbsp;code&nbsp;here</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;CString&nbsp;edit1,edit2,edit3;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;GetDlgItem(IDC_EDIT1)</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">GetWindowText(edit1);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;GetDlgItem(IDC_EDIT2)</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">GetWindowText(edit2);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;GetDlgItem(IDC_EDIT3)</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">GetWindowText(edit3);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;::WritePrivateProfileString(_T(edit1),_T(edit2),_T(edit3),_T(buf));<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span></div>
<br>
<img src ="http://www.cppblog.com/GUO/aggbug/116906.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/GUO/" target="_blank">CrazyNerd</a> 2010-06-01 16:15 <a href="http://www.cppblog.com/GUO/archive/2010/06/01/116906.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>