??xml version="1.0" encoding="utf-8" standalone="yes"?>香蕉99久久国产综合精品宅男自 ,国产精品99久久免费观看,久久婷婷色综合一区二区http://www.shnenglu.com/amazon/category/8956.htmlzh-cnSat, 01 Oct 2011 01:05:18 GMTSat, 01 Oct 2011 01:05:18 GMT60C/C++结杂烩http://www.shnenglu.com/amazon/archive/2009/12/17/103405.htmlq风q风Thu, 17 Dec 2009 08:27:00 GMThttp://www.shnenglu.com/amazon/archive/2009/12/17/103405.htmlhttp://www.shnenglu.com/amazon/comments/103405.htmlhttp://www.shnenglu.com/amazon/archive/2009/12/17/103405.html#Feedback0http://www.shnenglu.com/amazon/comments/commentRss/103405.htmlhttp://www.shnenglu.com/amazon/services/trackbacks/103405.html1.define宏定?/strong>

define中的#?#Q?br>Q?Q?可以define中的参数转化为字W串Q例如:(x)
#define PRINT(x) printf(#x “ is %d”, x);
Q?Q?#可以define中的参数转化为某个标识符的一部分Q例如:(x)
int tmp_a = 23;
#define PRINT(x) printf(#x “ is %d”, tmp_##x);

define的位|:(x)
宏定义可以出现在所有函数外部或者某函数内部Q遵循两个规则:(x)
W一Q?nbsp;内部定义覆盖外部定义。如果全局的宏定义与某内部宏定义重名时QVC6.0~译器会(x)提示warning但不出错Q且以内部宏定义为准?br>W二Q?nbsp;定义点后均可使用Q不以函数内外划分作用域Q仅以文本中出现位置前后划分?br>
define解析序Q?br>#define f(a,b) a##b
#define g(a) #a
#define h(a) g(a)
void macrotest(void)
{
printf("%s,",h(f(1,2)));
printf("%s\n",g(f(1,2)));
}
最后答案是Q?2, f(1,2)
分析Q解析一个串从左臛_Q一遍之后再从头开始。所以h(f(1,2)) -> g(f(1,2)) -> g(12) -> 12Q而g(f(1,2)) -> #(f(1,2)) -> f(1,2)?br>
define的缺P(x)
W一Q?nbsp;对于所有的function-like macrosQ所有的参数都要括v来,以防止macros(a+b)的情况出玎ͼ而且要注意是否有cMmacros(i++)的情况出玎ͼ防止在文本替换后i++执行多次?br>W二Q?nbsp;宏不做类型检查,而且预处理展开后消׃无ŞQ编译出错了(jin)很难扑ֈ错误?br>W三Q?nbsp;使用宏后?#8220;函数”不能取址Q不能作为函数指针传递给另一个函数?br>W四Q?nbsp;一般用inline函数代替宏函敎ͼcM的,一般用const变量代替宏变量?br>
2.strncpy和strncat

strncpy(dest, src, size);
使用strncpy(a, b, size)函数ӞҎ(gu)size值分两种情况Q?br>W一Qsize比字W串b长度大时Q将b字符串赋laQ再a中size-b.length的多余位|赋gؓ(f)\0?br>W二Qsize比字W串b长度时Q将size长度的b子字W串赋给aQ但不自动在后面d\0?br>
strncat(dest, src, size);
使用strncat(a, b, size)函数ӞҎ(gu)size值分两种情况Q?br>W一Qsize比字W串b长度大时Q将b字符串赋laW一个\0l束W处Qƈ自动在右面添加\0Q多余的size-b.length位置不赋倹{?br>W二Qsize比字W串b长度时Q将size长度的字W串赋给aW一个\0l束W处Qƈ且自动在后面d\0?br>
3.printf和scanf

printf(“%x, %x, %x”, a, b, c);
printf注意事项Q?br>W一Q?pirntf参数从右向左依次压栈?br>W二Q?nbsp;字符?×和后面参C左至右依ơ映,当参数多出时可忽略不计?br>W三Q?nbsp;字符?×和后面参C左至右依ơ映,?×多出Ӟ打印出来的结果不可预(因ؓ(f)VC下参C叛_左压栈,所以多出的%×只能对应不可预知的内存)(j)?br>
其他

4.rand()函数的最大取值是0X7fffQ也是2?5ơ方-1?br>
5.对于数组char a[100]Qsizeof(a)的值是100Q表C数l大,而sizeof(&a)按道理来说应该是4Q表C指向数la的指针的大小Q但是某些MSVC版本对arrayName?amp;arrayName是不区分的,需要安装sp1的MSVC的补丁才可去掉这个bug?br>
6.C语言中,不写q回cd的函敎ͼ一般默认ؓ(f)int型,而C++中必L明返回类型。但在一般的~译器实CQ可能会(x)做放宽处理,例如VC6.0中可以接受C++函数没有q回cdQ默认ؓ(f)int?br>
7.q回gؓ(f)数组指针
如果函数q回值是int(*)[NUM]cdQ不可写成int(*)[NUM] func() {}的Ş式,而应该写成:(x)
int (*func)() [NUM] {}
或者用typedef来简化:(x)
typedef int(*)[NUM] type;
type func() {}

那么Q如何保存函数的q回值呢Q具体如下:(x)
int a[num1][NUM];
int (*b)[NUM] = &a[num2];
b = func();

8.l构?br>l构体有赋值操作,但是没有比较操作Q可以重?={这些比较运符Q同Ӟ最好别用memcmp函数q行l构体的比较操作Q因考虑到结构体的对齐问题,且填充的字节是随机的?br>
9.函数指针
void func() {}
printf(“%p  %p  %p”, func, &func, *func);
其结果是一L(fng)Q原因在于:(x)
函数名就是函数名Q除?jin)少量情况,它?x)退化ؓ(f)函数指针Q即发生function-to-pointer转换。fun单独攄的时候就?x)发生退化,而在&fun的情况下不会(x)退化,所以单独的fun?amp;fun的类型、值都一栗?fun则是fun先发生退化,变成函数指针Q?变成函数cdQ然后再退化成函数指针Q所以函数类型怎么*都一栗(maybeQ?br>
10.(int&)a?int)a的区?br>(int&)a不经q{换,直接得到a在内存单元的|(int)a则是a在内存中的D{换成intcdQ那么存在两U情况:(x)
W一Q?nbsp;acd是intQ此?int&)a?int)a是相{的?br>W二Q?nbsp;acd是float{,׃float在内存中存储的Ş式是W号?指数+数Q而阶码采用增码,为数采用源码Q与int的存储Ş式不同?int)a?x)先内存中的D{换成intcdQ然后给aQ?int&)a则直接将内存中的值给aQ不l过转换Q所以此时两者不相等?br>



q风 2009-12-17 16:27 发表评论
]]>
32位系l中VC++可识别类?/title><link>http://www.shnenglu.com/amazon/archive/2009/12/12/103073.html</link><dc:creator>q风</dc:creator><author>q风</author><pubDate>Sat, 12 Dec 2009 14:02:00 GMT</pubDate><guid>http://www.shnenglu.com/amazon/archive/2009/12/12/103073.html</guid><wfw:comment>http://www.shnenglu.com/amazon/comments/103073.html</wfw:comment><comments>http://www.shnenglu.com/amazon/archive/2009/12/12/103073.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/amazon/comments/commentRss/103073.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/amazon/services/trackbacks/103073.html</trackback:ping><description><![CDATA[<p><strong>C/C++中类型:(x)</strong><br><br><img border=0 alt="" src="http://www.shnenglu.com/images/cppblog_com/amazon/type3.JPG" width=573 height=425></p> <p><br><strong>windows中常用类型:(x)<br></strong><br><img border=0 alt="" src="http://www.shnenglu.com/images/cppblog_com/amazon/type1.JPG" width=576 height=420><br><br><img border=0 alt="" src="http://www.shnenglu.com/images/cppblog_com/amazon/type2.JPG" width=587 height=586></p> <br> <img src ="http://www.shnenglu.com/amazon/aggbug/103073.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/amazon/" target="_blank">q风</a> 2009-12-12 22:02 <a href="http://www.shnenglu.com/amazon/archive/2009/12/12/103073.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用MessageBoxq行多线E调?/title><link>http://www.shnenglu.com/amazon/archive/2009/12/09/102851.html</link><dc:creator>q风</dc:creator><author>q风</author><pubDate>Wed, 09 Dec 2009 07:35:00 GMT</pubDate><guid>http://www.shnenglu.com/amazon/archive/2009/12/09/102851.html</guid><wfw:comment>http://www.shnenglu.com/amazon/comments/102851.html</wfw:comment><comments>http://www.shnenglu.com/amazon/archive/2009/12/09/102851.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/amazon/comments/commentRss/102851.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/amazon/services/trackbacks/102851.html</trackback:ping><description><![CDATA[<p style="MARGIN-RIGHT: 0px" dir=ltr>׃多线E的特点Q无法像在单U程里一样用单步跟t和断点调试Q在多线E或者窗口函C可以使用MessageBox来调试,该函数定义ؓ(f)Q?br>MessageBox(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType);<br>其中Q?br>HWND是窗口句柄,可以为NULLQ?br>lpText是文本内容;<br>lpCaption是窗口标题;<br>uType是窗口类型,如MB_OK、MB_OKCANCEL、MB_YESNO、MB_YESNOCANCELQ?br>q回值是IDCANCEL、IDNO、IDOK、IDYES?br>注意QLPCSTR和LPCWSTR在VC6.0中可以是char型的字符Ԍ但是在VC2005下要改ؓ(f)char_t型的字符Ԍ也就是用_T(“……”)的机制?br><br>W者在q行实验的时候,让线Ecout输出或者messagebox输出Q没有显C结果,代码如下Q?br></p> <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.shnenglu.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">DWORD WINAPI Func1(LPVOID param)<br><img id=Codehighlighter1_33_110_Open_Image onclick="this.style.display='none'; Codehighlighter1_33_110_Open_Text.style.display='none'; Codehighlighter1_33_110_Closed_Image.style.display='inline'; Codehighlighter1_33_110_Closed_Text.style.display='inline';" align=top src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_33_110_Closed_Image onclick="this.style.display='none'; Codehighlighter1_33_110_Closed_Text.style.display='none'; Codehighlighter1_33_110_Open_Image.style.display='inline'; Codehighlighter1_33_110_Open_Text.style.display='inline';" align=top src="http://www.shnenglu.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_33_110_Closed_Text><img src="http://www.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_33_110_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif">cout </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">test</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> endl;<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif">MessageBox(NULL, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">test</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ddd</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, MB_OK);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> main()<br><img id=Codehighlighter1_124_282_Open_Image onclick="this.style.display='none'; Codehighlighter1_124_282_Open_Text.style.display='none'; Codehighlighter1_124_282_Closed_Image.style.display='inline'; Codehighlighter1_124_282_Closed_Text.style.display='inline';" align=top src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_124_282_Closed_Image onclick="this.style.display='none'; Codehighlighter1_124_282_Closed_Text.style.display='none'; Codehighlighter1_124_282_Open_Image.style.display='inline'; Codehighlighter1_124_282_Open_Text.style.display='inline';" align=top src="http://www.shnenglu.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_124_282_Closed_Text><img src="http://www.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_124_282_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif">HANDLE p;<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif">DWORD a </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">;<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif">DWORD id </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif">p </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> CreateThread(NULL, </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">, (LPTHREAD_START_ROUTINE)Func1, </span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">a, </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">id);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">WaitForSingleObject(p, INFINITE);</span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span></div> <p style="MARGIN-RIGHT: 0px" dir=ltr>后来查明具体原因为:(x)ȝE运行太快,DE序在Func1U程打印语句之前已l退Z(jin)。更正方法ؓ(f)在main中创建线EFunc1后添加同步机制WaitForSingleObject(p, INFINITE)?br></p> <img src ="http://www.shnenglu.com/amazon/aggbug/102851.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/amazon/" target="_blank">q风</a> 2009-12-09 15:35 <a href="http://www.shnenglu.com/amazon/archive/2009/12/09/102851.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>const在C和C++中的不同http://www.shnenglu.com/amazon/archive/2009/12/09/102850.htmlq风q风Wed, 09 Dec 2009 07:14:00 GMThttp://www.shnenglu.com/amazon/archive/2009/12/09/102850.htmlhttp://www.shnenglu.com/amazon/comments/102850.htmlhttp://www.shnenglu.com/amazon/archive/2009/12/09/102850.html#Feedback0http://www.shnenglu.com/amazon/comments/commentRss/102850.htmlhttp://www.shnenglu.com/amazon/services/trackbacks/102850.html
Q?QC++能够把已用常量赋|必须是常量赋D不是函数赋值等Q的const变量看作~译期常敎ͼ而C没有q种功能?br>const int BUFSIZE = 1024;    //必须是常量赋?br>char buf[BUFSIZE];               //C++中允?br>
Q?QC++默认const变量的链接性质是内部的Q而C则默认是外部的。在C++中必M用extern声明aQa才能在其他文件用?br>const int a = 0;                       //C++中不可以在其他文件中使用QC可以
extern const int a = 0;            //C++中可以在其他文g中?br>
Q?QC只能允许帔R初始化const外部变量Q但是C++中没有限Ӟ如:(x)
int f(void);
const int a = f();                     //C++允许




q风 2009-12-09 15:14 发表评论
]]>
数据存储cdQauto/static/register/externhttp://www.shnenglu.com/amazon/archive/2009/12/09/102847.htmlq风q风Wed, 09 Dec 2009 07:02:00 GMThttp://www.shnenglu.com/amazon/archive/2009/12/09/102847.htmlhttp://www.shnenglu.com/amazon/comments/102847.htmlhttp://www.shnenglu.com/amazon/archive/2009/12/09/102847.html#Feedback0http://www.shnenglu.com/amazon/comments/commentRss/102847.htmlhttp://www.shnenglu.com/amazon/services/trackbacks/102847.html
auto变量Q?/strong>
函数中的局部变量,如不专门声明为static存储cdQ都是动态地分配存储I间的,数据存储在动态存储区中。函C的Ş参和在函C定义的变量(包括在复合语句中定义的变量)(j)Q都属此c,在调用该函数时系l会(x)l它们分配存储空_(d)在函数调用结束时p动释放这些存储空间。这cd部变量称动变量。自动变量用关键字auto作存储类别的声明。关键字auto可以省略Qauto不写则隐含定?#8220;自动存储cd”Q属于动态存储方式?br>注意Q?br>Q?Q用auto修饰全局变量~译无法通过?br>
static局部变量:(x)
有时希望函数中的局部变量的值在函数调用l束后不消失而保留原|q时应该指定局部变量ؓ(f)“?rn)态局部变?#8221;Q用关键字staticq行声明?br>说明Q?br>Q?Q静(rn)态局部变量属于静(rn)态存储类别,在静(rn)态存储区内分配存储单元。在E序整个q行期间都不释放。而自动变量(卛_态局部变量)(j)属于动态存储类别,占动态存储空_(d)函数调用l束后即释放?br>Q?Q静(rn)态局部变量在~译时赋初|卛_赋初gơ;而对自动变量赋初值是在函数调用时q行Q每调用一ơ函数重新给一ơ初|相当于执行一ơ赋D句?br>Q?Q如果在定义局部变量时不赋初值的话,则对?rn)态局部变量来_(d)~译时自动赋初?Q对数值型变量Q或I字W(对字W变量)(j)。而对自动变量来说Q如果不赋初值则它的值是一个不定的倹{?br>
register变量Q?br>Z(jin)提高效率QC语言允许局部变量的值放在CPU中的寄存器中Q这U变量叫“寄存器变?#8221;Q用关键字register作声明?br>说明Q?br>Q?Q只有局部自动变量和形式参数可以作ؓ(f)寄存器变量,否则无法~译Q?br>Q?Q一个计机pȝ中的寄存器数目有限,不能定义L多个寄存器变量;
Q?Q局部静(rn)态变量不能定义ؓ(f)寄存器变量?br>
extern外部变量Q?br>外部变量Q即全局变量Q是在函数的外部定义的,它的作用域ؓ(f)从变量定义处开始,到本E序文g的末。如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件终?jin)。如果在定义点之前的函数惛_用该外部变量Q则应该在引用之前用关键字extern对该变量?#8220;外部变量声明”。表C变量是一个已l定义的外部变量。有?jin)此声明Q就可以?#8220;声明”处vQ合法地使用该外部变量?br>说明Q?br>Q?Q用extern修饰局部变量编译出错,昄“重定?#8221;?br>Q?Q全局变量中,带有初始化的语句是定义(int a = 1;Q,带有extern的语句是声明Qextern int a;Q,除非是对变量q行初始化(extern int b = 2;Q?br>


q风 2009-12-09 15:02 发表评论
]]>
string用法ȝhttp://www.shnenglu.com/amazon/archive/2009/10/18/92951.htmlq风q风Sun, 18 Oct 2009 13:29:00 GMThttp://www.shnenglu.com/amazon/archive/2009/10/18/92951.htmlhttp://www.shnenglu.com/amazon/comments/92951.htmlhttp://www.shnenglu.com/amazon/archive/2009/10/18/92951.html#Feedback0http://www.shnenglu.com/amazon/comments/commentRss/92951.htmlhttp://www.shnenglu.com/amazon/services/trackbacks/92951.html1.头文件包含:(x)
一般来说用string需要包?include <string>头文Ӟ但是下面的程序没有包含string头文件却能运行:(x)

#include <iostream>

using namespace std;

int main()
{
      
string str("fdsfsdaf");

      cout 
<< str.c_str();     //str.c_str()可以q行
      
//cout << str;               //str无法q行

      
return 0;
}

不包含string头文件时Qcout<<str无法q行Q当重新包含string头文件后Qcout<<strq行成功。ؓ(f)什么?Q?
初步设想Qiostream头文仉接导入了(jin)string头文Ӟ但是相当一部分的string操作定义在string头文件中Q例如程序中?lt;<操作W重载,不包含string头文件的话无法用。所以徏议编E时q是d导入string头文件?br>
2.stringcd声明Q?/strong>
string s;
string s(args);
其中args具体参数如下Q?br>str
str, len
chars
chars, len
chars, index, len
n, c
b, e

注意Q对string的操作,既可以用q代器,也可以用下标Q它比容器具有更多的灉|性。以下用b、e和p表示q代器,pos表示下标Qcp表示指向ccdW串的指针?/span>

3.string操作Q?/strong>
=、assign()Q?br>对string对象赋以新倹{?双可以是stringcd、c_stringcd甚至?a'q样的单一字符。用assign()可以更灵zȝ对stringq行赋|例如Q?br>args具体参数如下Q?br>str
str, len
chars
chars, len
chars, index, len
n, c
b, e

swap()Q?br>交换两个字符串的内容Q例如s1.swap(s2)Q注意里面不可以是c_stringcd?br>
+=、append(args)、push_back()Q?br>在尾部添加字W?=后面可以是string、c_string甚至?a'q样的单一字符。其中args具体参数如下Q?br>str
str, len
chars
chars, len
chars, index, len
n, c
b, e
s.push_back('x')                    //用于每次增加一个字W?br>
insert()Q?br>在string某个位置插入字符Q插入位|在l定的烦(ch)引处。例如s.insert(4, str)。注意,q种形式的insert()函数不支持传入单个字W,要想传入单个字符必须写成字符串的形式?br>s.insert(p, t)              //在p前插入元素t
s.insert(p, n, t)          //在p前插入n个t
s.insert(p, b, e)         //b和e是P代器
s.insert(pos, args)
其中args具体参数如下Q?br>str
str, len
chars
chars, len
chars, index, len
n, c
b, e

erase()Q删除字W?br>s.erase(p)                //删除p指向的元素,q回指向该元素后面元素的q代?br>s.erase(b, e)            //删除b和e间的元素Q返回指向该元素后面元素的P代器
s.erase(pos, len)      //删除pos下标开始的len个字W?br>
clear()Q?br>清空字符Q例如s.clear()Q效果等同于s=""Q但是内部机制是否一h知?br>
replace()Q替换字W?br>s.replace(pos, args)
其中args具体参数如下Q?br>str
str, len
chars
chars, len
chars, index, len
n, c
b, e
同理把前两个参数换成b和e也可以?br>
+Q?br>串联字符丌Ӏ?br>
==?=?lt;?lt;=?gt;?gt;=、compare()Q?br>比较字符Ԍ可以在string与string、string与c_string间进行比较,例如str1 < str2Qs <= "abc"。compare()函数支持多参数处理,支持用烦(ch)引值和长度定位子串来进行比较,q回0表示相等Q正数表C大于,负数表示于Q例如:(x)
s.compare("abcd")
s.compare(s2)
s.compare(pos, len, s2)
s.compare(pos1, len1, s2, pos2, len2)
s.compare(pos, len, "....")
s.compare(pos1, len2, "....", pos2, len2)

size()、length()Q?br>q回字符数量Q两者等效?br>empty()Q?br>判断字符串是否ؓ(f)I?br>max_size()Q?br>q回字符的可能最大个敎ͼ很可能和机器本n的限制或者字W串所在位|连l内存的大小有关pR?br>capacity()Q?br>q回重新分配前的字符定w?br>reserve()Q?br>重置字符定w?br>
[]、at()Q?br>存取单一字符Q不同点在于at()?x)检查烦(ch)引是否有效,x否超?~s.length()-1的范_(d)如果出?x)抛出out_of_range的异常?br>
>>、getline()Q?br>从stream中读取某|其中getline()是读取一行,直到遇到分行W或者文件结?br><<Q?br>某值写入stream?br>
copy()Q?br>某string写入一个既有的c_string中,例如s.copy(chars, s.size())Q得到的字符?span style="COLOR: red">不以"\0"l尾
Q需要注意这炏V?br>c_str()Q?br>函数原型是const char* c_str() const{}Q例如s.c_str()返回一个const char*cdQ且?\0"l尾?br>data()Q?br>函数原型是const char* data() const{}Q例如s.data()q回一个const char*cdQ与c_str()不同的是它返回的字符串不?\0"l尾?br>
substr()Q?br>q回某个子字W串?br>s.substr()                 //q回s的全部内?br>s.substr(pos)            //从pos下标开始的所有字W?br>s.substr(pos, len)     //从烦(ch)引pos开始的len个字W?br>
begin()、end()Q?br>提供cMSTL的P代器支持?br>rbegin()、rend()Q?br>逆向q代器?br>get_allocator()Q返回配|器?br>
查找函数Q?br>find
rfind
find_first_of
find_last_of
find_first_not_of
find_last_not_of
参数1是被搜寻的对象,参数2指出搜寻L(fng)索引Q可无)(j)Q参?指出搜寻的字W个敎ͼ可无Q,q回值是索引|cd是string::size_typeQ如果没有找到目标,q回string::npos。注意:(x)string::npos的类型是string::size_typeQƈ不是int而是unsigned int?br>参数如下Q?br>c, pos              //从pos下标开始查扑֭WcQpos可默认ؓ(f)0
s2, pos            //从pos开始查找stringcds2Qpos可默认ؓ(f)0
cp, pos            //从pos开始查扑֭W串cpQpos可默认ؓ(f)0
cp, pos, len      //查找cp前n个字W,pos和len不可默认



q风 2009-10-18 21:29 发表评论
]]>
cȝҎ(gu)大小情况http://www.shnenglu.com/amazon/archive/2009/10/17/98840.htmlq风q风Sat, 17 Oct 2009 11:02:00 GMThttp://www.shnenglu.com/amazon/archive/2009/10/17/98840.htmlhttp://www.shnenglu.com/amazon/comments/98840.htmlhttp://www.shnenglu.com/amazon/archive/2009/10/17/98840.html#Feedback0http://www.shnenglu.com/amazon/comments/commentRss/98840.htmlhttp://www.shnenglu.com/amazon/services/trackbacks/98840.html1.I类
2.带有虚函数的c?br>3.l承父类的子c?br>4.带有static成员的类
5.普通类

class A 
{
}
;
//l果Qsizeof(A)=1
//原因Q空cdƈ不是什么都没有Q而是隐含插入?jin)一个字节作为地址偏移量。如果空c长度ؓ(f)0Q那创徏n个类实例时会(x)出现q些实例都在同一位置的问题?/span>

class A 
{
    
int num;
    
virtual void func() = 0;
}
;
//l果Qsizeof(A)=8
//原因Q如果类中有U虚函数或者虚函数Q那么有一个指向虚函数的指针,该指针大ؓ(f)4个字节?/span>

class A 
{
}
;
class B : public A
{
    
//d
}
;
//l果Q?#8220;d”处没有Q何语句,sizeof(B)=1Q添加int aQsizeof(B)=4?br>//原因Q和非承的情况一栗?/span>

class A 
{
}
;
class B
{
}
;
class C : public B, public A
{
    
//d
}
;
//l果Q?#8220;d”处中不加M语句Qsizeof(C)=1Q添加int aQsizeof(C)=18Q添加char aQsizeof(C)=12Q添加shortQsizeof(C)=14?br>//原因Q不dM语句的那1个字节是偏移量,而添加其他变量后因ؓ(f)寚w的原因(和结构体相同Q,所以出现这U结果?/span>

class A 
{
    
int b;
    
static int a;
}
;
//l果Qsizeof(A)=4
//原因Q类的静(rn)态数据成员放在全局?rn)态存储区中,不媄(jing)响类的大。而类的非?rn)态数据成员只有被实例化的时候,他们才存在?/span>

class A 
{
    A()
{};
    
~A(){};
    
int Func(){};
    
int a;
}
;
//l果Qsizeof(A)=4
//原因Q类的大与它当中的构造函敎ͼ析构函数Q以?qing)其他的成员函数无关Q纯虚函数除外)(j)Q只与它当中的成员数据有兟?/span>

从以上的几个例子不难发现cȝ大小Q?br>1.为类的非?rn)态成员数据的cd大小之和
2.有编译器额外加入的成员变量的大小Q用来支持语a的某些特性(如:(x)指向虚函数的指针Q?br>3.Z(jin)优化存取效率Q进行的边缘调整
4.与类中的构造函敎ͼ析构函数以及(qing)其他的成员函数无?br>


q风 2009-10-17 19:02 发表评论
]]>
常用Win IDE库函?/title><link>http://www.shnenglu.com/amazon/archive/2009/10/11/98310.html</link><dc:creator>q风</dc:creator><author>q风</author><pubDate>Sun, 11 Oct 2009 07:07:00 GMT</pubDate><guid>http://www.shnenglu.com/amazon/archive/2009/10/11/98310.html</guid><wfw:comment>http://www.shnenglu.com/amazon/comments/98310.html</wfw:comment><comments>http://www.shnenglu.com/amazon/archive/2009/10/11/98310.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/amazon/comments/commentRss/98310.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/amazon/services/trackbacks/98310.html</trackback:ping><description><![CDATA[<p><strong>注意Q资料来源较早,以下使用floatcd的函数参数目前已l全部改为double?br><br><br>数学函数Q?/strong></p> <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.shnenglu.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">math.h</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> abs(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> x);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> fabs(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> x);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> sin(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> x);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> asin(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> x);          </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">x in [-1.0, 1.0]</span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> cos(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> x);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> acos(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> x);         </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">x in [-1.0, 1.0]</span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> tan(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> x);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> atan(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> x);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> atan2(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> x, </span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> y);  </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">求x/y的反正切?/span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> sinh(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> x);                 </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">求x的双曲正弦|(e^x – e^(-x)) / 2</span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> cosh(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> x);                </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">求x的双曲余弦|(e^x + e^(-x) / 2)</span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> tanh(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> x);                </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">求x的双曲正切|(e^x – e^(-x)) / (e^x + e^(-x))</span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> ceil(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> x);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> floor(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> x);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> exp(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> x);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> fmod(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> x, </span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> y);     </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">求x/y的余敎ͼx – x / y</span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> frexp(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> x, </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">exp);  </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">把x分解成尾数和2的指敎ͼq回数是数Qexp是指?/span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> ldexp(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> x, </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> exp);    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">转蝲点敎ͼq回x*2^exp的?/span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> modf(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> x, </span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">i);   </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">x分解成整数和数Q返回值是数部分Qi是整数部?/span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> hypot(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> x, </span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> y);  </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Ҏ(gu)勾股定理q回斜边</span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> log(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> x);                     </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">x > 0</span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> log10(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> x);                 </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">x > 0</span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> pow(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> x, </span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> y);     </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">x > 0</span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> sqrt(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> x);                   </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">x > 0</span></div> <p><br><br><strong>字符函数Q?/strong></p> <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.shnenglu.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">ctype.h</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> isalnum(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> c);       </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">判断是否?-9、a-z、A-z中的字符</span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> isalpha(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> c);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> isaldigit(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> c);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> iscntrl(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> c);         </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">判断c是否为控制字W,0X00-0X1F之间?X7FQDELQ?/span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> islower(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> c);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> isupper(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> c);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> isascii(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> c);         </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">判断是否为ASCII码,?X00-0X7F之间的字W?/span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> isgraph(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> c);        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">c是否为除I格之外的可打印字符Q指0X21-0X7E</span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> isprint(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> c);         </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">c是否为可打印字符Q包含空|?x20-0x7E</span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> ispunct(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> c);        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">c是否为标点符P指非字符数字Q非I格的可打印字符</span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> isspace(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> c);       </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">I白W指I格、制表符、换늬、回车符、换行符</span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> isxdigit(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> c);        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">是否16q制数字Q指0-9、A-F、a-f之间的字W?/span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> toascii(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> c);         </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">c转换成ascii码,即高位清Ӟ仅保留低7?/span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> tolower(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> c);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> toupper(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> c);</span></div> <p><br><br><strong>动态内存分配:(x)</strong></p> <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.shnenglu.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">stdlib.h</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">malloc(unsigned </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> num_bytes);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">realloc(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">mem_address, unsigned </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> newsize);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">alloc(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> num_elems, </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> elem_size);</span></div> <p><br><br><strong>字符串函敎ͼ(x)</strong></p> <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.shnenglu.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">.h</span><span style="COLOR: #000000">></span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">memchr(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">buf, </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> ch, unsigned count);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">在buf所指内存前count个字节查扑֭WchQ返回指向ch的指针或NULL</span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> memcmp(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">buf1, </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">buf2, unsigned </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> count);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">比较buf1和buf2的前count个字节,< = > 分别q回 <0 =0 >0</span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> memicmp(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">buf1, </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">buf2, unsigned </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> count);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">比较buf1和buf2的前count个字节,但不区分字母大小?/span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">memccpy(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">dest, </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">src, unsigned </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> ch, unsigned </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> count);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">从src中复制不多于count个字节到destQ遇到字Wch则停止复制。返回指向ch后的W一个字W的指针Q没有遇到ch则返回NULLQ注意ch也被复制</span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">memcpy(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">dest, </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">src, unsigned </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> count);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">从src中复制不多于count个字节到destQ返回指向dest的指针,注意dest和src不能重叠</span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">memmove(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">dest, </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">src, unsigned </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> count);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">从src中复制不多于count个字节到destQ返回指向dest的指针,其中dest和src所指内存区域可以重叠,但是src内容?x)被更?/span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">memeset(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">buffer, </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> c, </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> count);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">buffer所指区域前count个字节设|成c字符Q返回buffer指针<br><br>   //×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××<br>   //分界U?br></span><span style="COLOR: #008000">   //×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">strcpy(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">dest, </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">src);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> src所有字W串复制到dest中,两者区域不可重叠,且dest必须要有_I间Q返回dest指针</span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">strncpy(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">dest, </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">src, </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> n);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> src前n个字W复制到dest中,两者区域不可重叠,且dest必须要有_I间Q返回dest指针。如果src前n个字W不?\0"Q则dest不以"\0"l束Q如果src长度于nQ则?\0"填充dest直到n个字节复制完?/span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">strdup(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">s);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">函数内malloc()分配I间Q返回指向被复制的字W串的指针,需要在函数中h工free掉分配的I间<br></span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">strcat(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">dest, </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">src);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">联接dest和srcQdest改变Q两者区域不可重叠,且dest必须要有_I间Q返回dest指针</span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">strncat(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">dest, </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">src, </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> c);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">联接dest和src前n个字W,两者区域不可重叠,且dest必须要有_I间Q返回dest指针<br></span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> strcmp(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">s1, </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">s2);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">比较s1和s2Q?lt; = > 分别?nbsp;<0 =0 >0</span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> strncmp(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">s1, </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">s2, </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> n);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">比较s1和s2前n个字W,同上</span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> stricmp(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">s1, </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">s2);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">比较s1和s2Q不区分字符大小?/span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> strnicmp(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">s1, </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">s2, </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> n);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">比较s1和s2前n个字W,不区分字W大写<br><br><span style="COLOR: #0000ff">   char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">strchr(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">s, </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> c);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">查找s中c的首ơ出C|,q回c位置指针或者NULL</span></span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> strcspn(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">s1, </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">s2);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">在s1中搜索s2中出现的字符Q返回第一个出现在s1中的下标|亦即在s1中出现而s2中没有出现的字符串长?/span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">strpbrk(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">s1, </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">s2);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">在s1中搜索s2中出现的字符Q返回第一个出现在s1中的字符指针或者NULL<br><span style="COLOR: #0000ff">   char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">strstr(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">haystack, </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">needle);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">从haystack中寻找needleW一ơ出现的位置Q返回第一ơ出现的位置指针或者NULL</span><br></span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> strlen(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">s);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">q回s的长度,不包括结束符NULL</span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">strlwr(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">s);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">s转换为小写字母Ş式,q回指向s的指?/span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">strupr(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">s);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">s转换为大写字母Ş式,q回指向s的指?/span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">strrev(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">s);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">s的所有字W顺序颠倒过来,不包?#8220;\0”Q返回s指针</span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">strset(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">s, </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> c);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">s的字W设|成字符cQ?\0"不变Q,q回s的指?/span></div> <p> <br></p> <img src ="http://www.shnenglu.com/amazon/aggbug/98310.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/amazon/" target="_blank">q风</a> 2009-10-11 15:07 <a href="http://www.shnenglu.com/amazon/archive/2009/10/11/98310.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C/C++结杂烩http://www.shnenglu.com/amazon/archive/2009/09/21/96848.htmlq风q风Mon, 21 Sep 2009 06:38:00 GMThttp://www.shnenglu.com/amazon/archive/2009/09/21/96848.htmlhttp://www.shnenglu.com/amazon/comments/96848.htmlhttp://www.shnenglu.com/amazon/archive/2009/09/21/96848.html#Feedback0http://www.shnenglu.com/amazon/comments/commentRss/96848.htmlhttp://www.shnenglu.com/amazon/services/trackbacks/96848.html1.获得随机数的Ҏ(gu)Q?br>rand()函数用来生成随机敎ͼ但严格意义上来说只是生成?jin)伪随机数。在使用默认U子不变的情况下Q如果在E序内@环,那么下一ơ生成随机数时会(x)调用上一ơrand()的结果作为种子。但是用默认种子不变的情况下,每次执行E序得到的随机数都是相同的?br>此时可用srand()来指定种子数Q通常用当前时间作为种子:(x)srand(time(0))。具体情况如下:(x)
#include <cstdlib>
#include <ctime>
srand(time(0));
while(1)
{
result = rand() % 100;
}
注意Q千万不能把srand()写入循环当中Q否则得出的随机C当前旉有关Q同一U内的随机数是相同的?br>
2.位域Q位D)(j)
位域是一U数据结构,所谓位域是把一个字节中的二q位划分为几个不同的区域Qƈ说明每个区域的ؓ(f)敎ͼ每个域有一个域名,允许在程序中按域名进行操作。如此一来,p把几个不同对象用一个字节的二进制位域来表示?br>struct 位域l构?br>{ cd说明W?位域名:(x)位域长度; };
Q?Q一个位域必d储在同一个字节中Q不能跨两个字节。如一个字节所剩空间不够存攑֏一位域Ӟ应从下一单元起存放该位域Q当然也可以有意使某位域从下一单元开始?br>struct bs
{
  unsigned a:4;
  unsigned :0;    /*I域*/
  unsigned b:4;   /*从下一单元开始存?/
  unsigned c:4;
};
Q?Q位域的长度不能大于一个字节的长度Q即不能过8位?br>Q?Q位域可以无位域名,q时它只用来填充或者调整位|,例如Q?br>struct k
{
  int a:1;
  int :2;     /*?位不能?/
  int b:3;
  int c:2;
};
位域的用方法和l构相同Q没有什么区别?br>注意Q对于位域的寚w方式Q和l构cM。比如int a : 4Q首先会(x)lintcd分配4个字节,然后高4位分laQ如果a前后变量也是intQ可以合用这4个字节(除非已经出4个字节的范围Q。最l整个位D늻构也要根据最大长度的cd来对齐?br>
3.6U位q算W?br>&  按位?
|   按位?
^  按位异或
~  取反            //不会(x)改变原?br><< 左移           //不会(x)改变原?br>>> 右移          //不会(x)改变原?br>
4.数值分为整型和实型Q整型就是不带小C的数Q例如char、int{,实型则是指带数位的敎ͼ也称点敎ͼ例如double、float{?br>
5.左值和叛_?br>凡是可以被赋值的表达式,叫左|左值L直接的或间接的变量(q回引用cd的函C可以作ؓ(f)左|(j)?br>凡是可以赋值给左值的Q就叫右|叛_可以是变量、常量、函数调用等?br>所有的左值都是右|反之不见得?br>注意Qƈ不是左值就是可以赋值的倹{可以被赋值的左值称为modifiable l-valuesQ不可赋值的左值称为nonmodifiable l-valuesQ包括有Q?br>const int i=3;       //i是左|但是不可能被赋?br>int a[10];            //a不可能被赋?br>struct Node a;   //一个struct或者union中包含constQ不可赋?br>++a=20;        //a是一个变量,可被E序dQ可以改变它的?br>a++=20;        //a++是一个引用了(jin)临时对象的表辑ּQ所以是叛_?br>a+5=20;        //a+5也是引用?jin)?f)时对象的表达式,不能d该对象,是右?br>
6.sizeof求长?br>32位系l中Q对于char a[10]q样的数l来_(d)sizeof(a)的gؓ(f)10Q对于char *p=“12345”q样的指针来_(d)sizeof(p)的gؓ(f)4Q要求p指向的字W串长度Q需要用strlen函数?br>对于char *p=malloc(100)q样的指针来_(d)sizeof(p)的gؓ(f)4Q要求分配内存的大小Q需要用到_msize函数Q?span style="COLOR: red">size_t  _msize(void *)?include <malloc.h>?/span>?br>对于函数总void Function(char a[100])Q相当于void Function(char *a)Q所以sizeof(a)的gؓ(f)4?br>
7.局部变量能和全局变量重名Q则局部变量屏蔽全局变量。需要用全局变量时?::"W号?#8220;::”表示全局有效域?br>
8.
main()
{
   char *c1 = "abc";
   char c2[] = "abc";
   char *c3 = ( char* )malloc(3);
   c3 = "abc";
   printf("%d %d %s\n",&c1,c1,c1);
   printf("%d %d %s\n",&c2,c2,c2);
   printf("%d %d %s\n",&c3,c3,c3);
   getchar();
}
q行l果
   2293628 4199056 abc
   2293624 2293624 abc
   2293620 4199056 abc
分析Q?br>char *c1 = "abc"中的字符串是帔R字符Ԍ存储在常量区中;char c2[] = "abc"的字W串存储在栈中;char *c3 = ( char* )malloc(3)存储在堆中;c3 = "abc"使得c3指向新的帔R字符Ԍ而不是对动态申L(fng)内存q行更新Q同Ӟc1Qc2Qc3q三个变量都是局部变量,只不q存储的是指向的内存地址Q占4个字节的长度?br>&c2和c2指向同一个地址Q只不过&c2指向的是char[3]数组cdQc2指向的是charcdQc1和c3指向同一个地址Q因为c3指向新的字符Ԍ而且l过~译器优化后Q与c1指向同一个字W串?br>&c1?amp;c2?amp;c3的值分别ؓ(f)2293620?293624?293628Q这是因为指针c1和c2占了(jin)4个字节的长度Q而c2指向的数l恰好也占了(jin)4个字节的长度?br>
9.l构体对齐问?br>l构体中成员寚w的条件是Q?br>Q?Q每个成员按照自q方式寚wQ对齐规则是每个成员按照cd的大和寚w参数Q默认是8字节Q中较小的一个来寚wQ?br>Q?Q整体结构的默认寚w方式是按照最长的成员和对齐参C较小的那个来寚w?br>Q?Qȝ来说Q对齐方式无非是1????6……{?br>讄寚w的预~译命o(h)是:(x)
#pragma pack(1)
其中pack()中的数字表示寚w参数Q字节数Q,不写表示默认?字节?br>struct{
short a1;
short a2;
short a3;
}A; 
//sizeof(A) = 6
struct{
long a1;
short a2;
}B;
//sizeof(B) = 8
#pragma pack(8)
struct S1{
    char a;
    long b;
};
struct S2 {
    char c;
    struct S1 d;
    long long e;
};
//sizeof(S2) = 24
#pragma pack(1)
struct{
short a1;
short a2;
short a3;
}A;
//sizeof(A) = 6
struct{
long a1;
short a2;
}B;
#pragma pack(pop) 
//sizeof(B) = 6

10.
?rn)态定义的变量对象UCؓ(f)有名对象Q动态定义的变量对象UCؓ(f)无名对象?br>动态定义的对象初始化:(x)需要用初始化式显C初始化Q且动态定义的cd数组不能初始化?br>动态徏立类数组Ӟ必须要有~省的构造函敎ͼ因ؓ(f)数组不可d初始化式?br>
11.memcpy / memmove / strstr / strcpy
函数原型Qvoid *memmove(void *dest, const void *source, size_t count)
q回D明:(x)q回指向dest的void *指针
参数说明Qdest,source分别为目标串和源串的首地址。countUd的字W的个数
函数说明Qmemmove用于从source拯count个字W到destQ如果目标区域和源区域有重叠的话Qmemmove能够保证源串在被覆盖之前重叠区域的字节拯到目标区域中?/p>

函数原型Qvoid *memcpy(void *dest, const void *source, size_t count);
q回D明:(x)q回指向dest的void *指针
函数说明Qmemcpy功能和memmove相同Q但是memcpy中dest和source中的区域不能重叠Q否则会(x)出现未知l果?/p>

原型Qchar *strstr(char *haystack, char *needle);
用法Q?include <string.h>
功能Q从字符串haystack中寻找needleW一ơ出现的位置Q不比较l束WNULL)?br>说明Q返回指向第一ơ出现needle位置的指针,如果没找到则q回NULL?/p>

函数原型Qchar * strcpy(char * strDest,const char * strSrc);
char * strcpy(char * strDest,const char * strSrc)
{
if ((strDest==NULL)||(strSrc==NULL))
throw "Invalid argument(s)";
char * strDestCopy=strDest;
while ((*strDest++=*strSrc++)!='\0')
;
return strDestCopy;
}

memcpy和memmove 的区别:(x)
函数memcpy()从source指向的区域向dest指向的区域复制count个字W,如果两数l重叠,不定义该函数的行为。而memmove()如果两函数重叠,赋g正确q行。memcpy函数假设要复制的内存区域不存在重叠,如果你能保你进行复制操作的的内存区域没有Q何重叠,可以直接用memcpyQ如果你不能保证是否有重叠,Z(jin)保复制的正性,你必ȝmemmove。memcpy的效率会(x)比memmove高一些,如果q不明白的话可以看一些两者的实现Q?/p>

void *memmove(void *dest, const void *source, size_t count)
{
assert((NULL != dest) && (NULL != source));
char *tmp, *s;
if (dest <= src)
{
    tmp = (char *) dest;
    s = (char *) src;
    while (count--)
          *tmp++ = *s++;
}
Else
{
    tmp = (char *) dest + count;
    s = (char *) src + count;
    while (count--)
        *--tmp = *--s;
}
return dest;
}

12.++i与i++
int arr[] = {6,7,8,9,10};
int *ptr = arr;
*(ptr++) +=123;
Print(“%d %d”, *ptr, *(++ptr));
一定要注意求值顺序,*(ptr++) +=123中先做加?+123Q然后ptr++Q此时指针指?Q对于Print(“%d %d”, *ptr, *(++ptr))Q从后往前执行,先做++ptrQ指?Q然后输???br>注:(x)一般禁止在语句中这样?+q算W,因ؓ(f)?x)依赖不同的~译器而有所不同。例如,TC中printf语句从右向左执行QVC6.0中同样从叛_左执行,但是在遇见后增运符a++或者a--时是在整个printf语句后才执行?br>int i=8;
printf("%d\n%d\n%d\n%d\n",++i,--i,i++,i--);
q个函数的输出结果在VC里是8 7 8 8Q在TC里是8 7 7 8?br>int i=3, j;
j = (i++)*(i++);
q个表达式输出j?Qi最后是5Q因Z个i++是在整个q算式之后才q行的?br>int i=3, j;
j = (++i)*(++i);
q个表达式输出j?5Qi最后是5Q因?+i相当于i?后将i攑օ式子中,所以j=i*iQ且i??br>int i=3, j;
printf(“%d %d”, ++i, ++i);
q个表达式输?, 4Qؓ(f)什么两个g一样呢Q因为printf是函敎ͼ?+i传给printf后,相当于打印的是Ş参,而两?+i传入的Ş参不同?br>注:(x)特别要注意宏、运与函数使用i++?+i的情况,Ҏ(gu)让h困惑……

13.
add ( int a, int b )
{
return a + b;
}

int main(int argc, char* argv[])
{
printf ( "2 + 3 = %d", add ( 2, 3) );
return 0;
}
在C语言中,凡不加返回值类型限定的函数Q就?x)被~译器作回整型值处理;C++语言有很严格的类型安全检查,不允怸q情况(指函C加类型声明)(j)发生。可是编译器q不一定这么认定,譬如在Visual C++6.0中上qadd函数的编译无错也无警告且q行正确?br>#include "stdio.h"
int fun()
{
return 1;
}

main()
{
printf("%d",fun(2));
getchar();
}
在C语言中,可以l无参数的函C送Q意类型的参数Q但是在C++~译器中~译同样的代码则?x)出错。所以,无论在Cq是C++中,若函C接受M参数Q一定要指明参数为void?br>按照ANSI(American National Standards Institute)标准Q不能对void指针q行法操作Q即下列操作都是不合法的Q?br>void * pvoid;
pvoid++;       //ANSIQ错?br>pvoid += 1;    //ANSIQ错?br>ANSI标准之所以这栯定,是因为它坚持Q进行算法操作的指针必须是确定知道其指向数据cd大小的?br>例如Q?br>int *pint;
pint++;        //ANSIQ正?br>pint++的结果是使其增大sizeof(int)?br>但是大名鼎鼎的GNU(GNU's Not Unix的羃?则不q么认定Q它指定void *的算法操作与char *一致?br>因此下列语句在GNU~译器中皆正:(x)
pvoid++;      //GNUQ正?br>pvoid += 1;   //GNUQ正?br>pvoid++的执行结果是其增大了(jin)1?br>在实际的E序设计中,合ANSI标准Qƈ提高E序的可UL性,我们可以q样~写实现同样功能的代码:(x)
void * pvoid;
char* tmp = (char*)pvoid;
tmp++;    //ANSIQ正;GNUQ正?br>tmp += 1; //ANSIQ正;GNUQ正?br>GNU和ANSIq有一些区别,M而言QGNU较ANSI?#8220;开?#8221;Q提供了(jin)Ҏ(gu)多语法的支持。但是我们在真实设计Ӟq是应该可能地q合ANSI标准?br>



q风 2009-09-21 14:38 发表评论
]]>
LIB和DLL的区别与使用http://www.shnenglu.com/amazon/archive/2009/09/04/95318.htmlq风q风Fri, 04 Sep 2009 08:57:00 GMThttp://www.shnenglu.com/amazon/archive/2009/09/04/95318.htmlhttp://www.shnenglu.com/amazon/comments/95318.htmlhttp://www.shnenglu.com/amazon/archive/2009/09/04/95318.html#Feedback2http://www.shnenglu.com/amazon/comments/commentRss/95318.htmlhttp://www.shnenglu.com/amazon/services/trackbacks/95318.html共有两种库:(x)
一U是LIB包含?jin)函数所在的DLL文g和文件中函数位置的信息(入口Q,代码p行时加蝲在进E空间中的DLL提供Q称为动态链接库dynamic link library?br>一U是LIB包含函数代码本nQ在~译时直接将代码加入E序当中Q称为静(rn)态链接库static link library?br>共有两种链接方式Q?br>动态链接用动态链接库Q允许可执行模块Q?dll文g?exe文gQ仅包含在运行时定位DLL函数的可执行代码所需的信息?br>?rn)态链接用静(rn)态链接库Q链接器从静(rn)态链接库LIB获取所有被引用函数Qƈ库同代码一h到可执行文g中?br>
关于lib和dll的区别如下:(x)
Q?Qlib是编译时用到的,dll是运行时用到的。如果要完成源代码的~译Q只需要libQ如果要使动态链接的E序q行hQ只需要dll?br>Q?Q如果有dll文gQ那么lib一般是一些烦(ch)引信息,记录?jin)dll中函数的入口和位|,dll中是函数的具体内容;如果只有lib文gQ那么这个lib文g是静(rn)态编译出来的Q烦(ch)引和实现都在其中。用静(rn)态编译的lib文gQ在q行E序时不需要再挂动态库Q缺Ҏ(gu)D应用E序比较大,而且失去?jin)动态库的灵zL,发布新版本时要发布新的应用程序才行?br>Q?Q动态链接的情况下,有两个文Ӟ(x)一个是LIB文gQ一个是DLL文g。LIB包含被DLL导出的函数名U和位置QDLL包含实际的函数和数据Q应用程序用LIB文g链接到DLL文g。在应用E序的可执行文g中,存放的不是被调用的函C码,而是DLL中相应函C码的地址Q从而节省了(jin)内存资源。DLL和LIB文g必须随应用程序一起发行,否则应用E序?x)生错误。如果不想用lib文g或者没有lib文gQ可以用WIN32 API函数LoadLibrary、GetProcAddress装蝲?br>
使用lib需注意两个文gQ?br>Q?Q?h头文Ӟ包含lib中说明输出的cLW号原型或数据结构。应用程序调用libӞ需要将该文件包含入应用E序的源文g中?br>Q?Q?LIB文gQ略?br>
使用dll需注意三个文gQ?br>Q?Q?h头文Ӟ包含dll中说明输出的cLW号原型或数据结构的.h文g。应用程序调用dllӞ需要将该文件包含入应用E序的源文g中?br>Q?Q?LIB文gQ是dll在编译、链接成功之后生成的文gQ作用是当其他应用程序调用dllӞ需要将该文件引入应用程序,否则产生错误?span style="COLOR: red">如果不想用lib文g或者没有lib文gQ可以用WIN32 API函数LoadLibrary、GetProcAddress装蝲?br>Q?Q?dll文gQ真正的可执行文Ӟ开发成功后的应用程序在发布Ӟ只需要有.exe文g?dll文gQƈ不需?lib文g?h头文件?br>
使用lib的方法:(x)
?rn)态lib中,一个lib文g实际上是L个obj文g的集合,obj文g是cpp文g~译生成的。在~译q种?rn)态库工程ӞҎ(gu)不会(x)遇到链接错误Q即使有错,也只?x)在使用q个lib的EXT文g或者DLL工程里暴露出来?br>在VC中新Z个static librarycd的工ELibQ加入test.cpp文g和test.h文gQ头文g内包括函数声明)(j)Q然后编译,q成了(jin)Lib.lib文g?br>别的工程要用这个lib有两U方式:(x)
Q?Q在project->link->Object/Library Module中加入Lib.lib文gQ先查询工程目录Q再查询pȝLib目录Q;或者在源代码中加入指o(h)#pragma comment(lib, “Lib.lib”)?br>Q?Q将Lib.lib拷入工程所在目录,或者执行文件生成的目录Q或者系lLib目录中?br>Q?Q加入相应的头文件test.h?br>
使用DLL的方法:(x)
使用动态链接中的libQ不是obj文g的集合,即里面不?x)有实际的实玎ͼ它只是提供动态链接到DLL所需要的信息Q这Ulib可以在编译一个DLL工程时由~译器生成?br>创徏DLL工程的方法(略)(j)?br>Q?Q隐式链?br>W一U方法是Q通过project->link->Object/Library Module中加?lib文gQ或者在源代码中加入指o(h)#pragma comment(lib, “Lib.lib”)Q,q将.dll文g|入工程所在目录,然后d对应?h头文件?/p>
#include "stdafx.h"
#include 
"DLLSample.h"

#pragma comment(lib, 
"DLLSample.lib")    //你也可以在项目属性中讄库的链接

int main()
{
        TestDLL(
123);   //dll中的函数Q在DllSample.h中声?/span>
        return(1);
}

Q?Q显式链?br>需要函数指针和W(xu)IN32 API函数LoadLibrary、GetProcAddress装蝲Q用这U蝲入方法,不需?lib文g?h头文Ӟ只需?dll文g卛_Q将.dll文g|入工程目录中)(j)?/p>

#include <iostream>
#include 
<windows.h>         //使用函数和某些特D变?/span>
typedef void (*DLLFunc)(int);
int main()
{
        DLLFunc dllFunc;
        HINSTANCE hInstLibrary 
= LoadLibrary("DLLSample.dll");

        
if (hInstLibrary == NULL)
        
{
          FreeLibrary(hInstLibrary);
        }

        dllFunc 
= (DLLFunc)GetProcAddress(hInstLibrary, "TestDLL");
        
if (dllFunc == NULL)
        
{
          FreeLibrary(hInstLibrary);
        }

        dllFunc(
123);
        std::cin.
get();
        FreeLibrary(hInstLibrary);
        
return(1);
}


LoadLibrary函数利用一个名UC为参敎ͼ获得DLL的实例(HINSTANCEcd是实例的句柄Q,通常调用该函数后需要查看一下函数返回是否成功,如果不成功则q回NULLQ句柄无效)(j)Q此时调用函数FreeLibrary释放DLL获得的内存?br>GetProcAddress函数利用DLL的句柄和函数的名UC为参敎ͼq回相应的函数指针,同时必须使用{Q判断函数指针是否ؓ(f)NULLQ如果是则调用函数FreeLibrary释放DLL获得的内存。此后,可以使用函数指针来调用实际的函数?br>最后要记得使用FreeLibrary函数释放内存?br>
注意Q应用程序如何找到DLL文gQ?/span>
使用LoadLibrary昑ּ链接Q那么在函数的参C可以指定DLL文g的完整\径;如果不指定\径,或者进行隐式链接,W(xu)indows遵循下面的搜烦(ch)序来定位DLLQ?br>Q?Q包含EXE文g的目?br>Q?Q工E目?br>Q?QWindowspȝ目录
Q?QWindows目录
Q?Q列在Path环境变量中的一pd目录



q风 2009-09-04 16:57 发表评论
]]>
回调函数实现方式Q函数指针与函数对象http://www.shnenglu.com/amazon/archive/2009/08/28/94703.htmlq风q风Fri, 28 Aug 2009 13:58:00 GMThttp://www.shnenglu.com/amazon/archive/2009/08/28/94703.htmlhttp://www.shnenglu.com/amazon/comments/94703.htmlhttp://www.shnenglu.com/amazon/archive/2009/08/28/94703.html#Feedback0http://www.shnenglu.com/amazon/comments/commentRss/94703.htmlhttp://www.shnenglu.com/amazon/services/trackbacks/94703.html
Q?Q函数指针:(x)
int A(char *p);                             //回调函数
typedef int(*CallBack)(char *p);  //声明CallBackcd的函数指?/span>
CallBack myCallBack;                //定义函数指针变量
myCallBack = A;                        //赋|得到函数A的地址
B(A, 5);                                      //调用B函数

void B(CallBack lpCall, int num)
{
 
//B自己的语?/span>
 lpCall(“Hello”);
 
//B自己的语?/span>
}

Q?Q函数对象:(x)
函数对象是重载了(jin)operator()操作W的cd象,与普通的函数行ؓ(f)cM。一般情况下用函数对象优于函数指针,主要因ؓ(f)Q?br>W一Q函数对象具有封装性,可以在不改动外部接口的情况下修改内部操作Q?br>W二Q函数对象可以通过数据成员存储先前调用l果Q而普通函数只能通过?rn)态变量等方式实现Q?br>W三Q函数对象可以实现内联调用,加快E序速度?br>
class CallBack
{
public:
 
int operator()(int num)       //重蝲()操作W?/span>
 {
  
//…………………………..
 }

}

void B(CallBack call, int num)    //定义B函数
{
//B自己的语?/span>
call(num);
//B自己的语?/span>
}

B(CallBack(), 
5);                 //调用B函数



q风 2009-08-28 21:58 发表评论
]]>
引用、指针与consthttp://www.shnenglu.com/amazon/archive/2009/08/24/94242.htmlq风q风Mon, 24 Aug 2009 04:30:00 GMThttp://www.shnenglu.com/amazon/archive/2009/08/24/94242.htmlhttp://www.shnenglu.com/amazon/comments/94242.htmlhttp://www.shnenglu.com/amazon/archive/2009/08/24/94242.html#Feedback0http://www.shnenglu.com/amazon/comments/commentRss/94242.htmlhttp://www.shnenglu.com/amazon/services/trackbacks/94242.html1.引用和指针的区别
Q?Q引用必d声明时初始化Q而指针不用。用对象的地址初始化引用是错误的,应该用对象本w初始化引用Q但可以定义一个指针引用(卌引用变量是指针类型,q引用一个同cd指针Q?br>int *p = a;
int *&ref = p;    //okQ该引用变量引用int型指针,即p指向NULL也对
使用的语a如C++已经可能地限制引用变量的有效性,但不能完全保证。存在一些无法保证的情况Q例如用于初始化引用变量的变量未被构造,主要是因Z用指针初始化引用变量DQ此时指针指向NULLQ无变量Q:(x)
int *p = NULL;
int &tmp = *p;   //语句是有效的Q但是引用变量是无效的,因ؓ(f)引用变量不能引用NULL
例如引用对象被无意析构,常表Cؓ(f)对函数返回的临时变量的引用(q回值在函数q回时被析构Q结果引用错误)(j)Q?br>int result;
result = Function();  //warningQ但是result已经被赋gؓ(f)a的?br>int &Function()
{
 int a = 5;

 return a;
}
一般在使用q回值引用时Q常q回全局变量{无法析构的变量Q例如:(x)
int a = 5;    //a是全局变量
int result;
result = Function();  //不会(x)出现warning
int &Function()
{
 return a;
}
注意int &Function()的返回值可以充当左|但是如果x是函数的临时变量Q对其进行引用是危险的;所以要保证q回g?x)因函数q回而被析构。如下:(x)
int x = 0;    //x是全局变量
int &Function()
{
 return x;
}
void main()
{
 Function() = 100;   //此时x{于100
}
Q?Q指针可以指向NULLQ而引用不能引用NULL?br>Q?Q引用一旦声明,引用的对象不能改变(不能引用其他对象?jin)?j)Q但是引用对象的值可以改变;指针可以随时改变指向的对象,因此说指针更危险Q引用比指针安全。可以说Q引用是在不牺牲性能的情况下Q更安全的利用指针特性所使用的技术?br>Q?Q理Z存在两种必须用指针的情况Q其他情况下用引用而不是指针:(x)
A.可能存在不指向Q何对?NULL)Ӟ使用指针?br>B.需要指向不同对象时Q用指针?br>Q?Q在函数Function(int* &p)中,使用&目的是ؓ(f)?jin)可以改变p指针本nQ其能指向其他对象Q这U用法和Function(int** p)是一L(fng)Q即指向指针的指针?br>
2.const与指?/strong>
Q?Qconst int a = 10与int const a = 10{h(hun)Q同理const int*与int const*是等L(fng)?br>Q?Qconst int *a是指向const对象的指针,不可通过指针改变对象|而int * const a是const指针Q指针只能指向该对象?br>Q?Q指针指向const对象的情?br>const int a = 40;
int *p;
p = &a;         //错,~译错误Q?br>p = (int*)&a;   //~译通过Q但是p无法改变a的?br>const int *p;
p = &a;         //ok

3.const与引?/strong>
非Const引用只能l定C该引用同cd的对象;
Const引用则可l定C同但相关cd的对象或l定到右倹{?br>Q?Qconst对象Q包括常量、常?变量生成的无名(f)时变量)(j)必须用const引用来引用,而反q来const引用可以引用const和非const变量?br>int a = 5;
const int b = 10;
int &ref = a;         //ok
int &ref = b;         //error
const int &ref = b;   //okQ必Mؓ(f)const引用
const int &ref = a;   //ok
const int &ref = 5;      //okQ必Mؓ(f)const引用
const int &ref = a + 3;  //okQ必Mؓ(f)const引用
Q?Qconst引用可以用不同类型的对象初始化,
对于不同cd间的引用Q?br>double a = 3.5;
const int &ref = a;
实际上其工作程是先定义int tmp = (int)aQ然后const int &ref = tmpQ所以必ȝconst引用Q否则会(x)D错误。常?变量生成的无名(f)时变量同理?br>Q?Qconst引用可以指向需要(f)时对象的对象或?br>const int ival = 1024;
const int* &b = &ival;        //error
const int* const &b = &ival;  //ok
解释是:(x)
typedef const int * P;
P &b = &ival;        //errorQ因?amp;ival的g可改变,而b是非帔R指针
P const &b = &ival;  //{h(hun)于const P &b = &ival;




q风 2009-08-24 12:30 发表评论
]]>
C/C++结杂烩http://www.shnenglu.com/amazon/archive/2009/08/24/94223.htmlq风q风Mon, 24 Aug 2009 02:18:00 GMThttp://www.shnenglu.com/amazon/archive/2009/08/24/94223.htmlhttp://www.shnenglu.com/amazon/comments/94223.htmlhttp://www.shnenglu.com/amazon/archive/2009/08/24/94223.html#Feedback0http://www.shnenglu.com/amazon/comments/commentRss/94223.htmlhttp://www.shnenglu.com/amazon/services/trackbacks/94223.html1.VC6.0下不支持long long的类型格式,只支持__int64格式Q而VS2005下都支持。据_(d)__int64比long long处理速度要快Q结果是否属实待定?br>
2. 只要不是在关键字中,或标识符中,或字W串帔R中,随时都可以回车换行而不?x)提C有语法错误。还有一个换行符\Q也可以实现换行?br>如:(x)
int a
=
0
;
或:(x)
int\
a=\
0;
都可以?br>
3.#include查找序Q?br>如果文g名在括号中Q则C(j)++~译器将在存储标准头文g的主机系l的文gpȝ里查找;如果文g名包含在引号中,则编译器首先查找当前工作目录或源代码目录Q其ơ在标准位置查找?br>
4.求单链表是否存在环\Q?br>利用两个指针同时出发q行q逐,其中p1每次前进1步,p2每次前进2步,如果有环路的话两者必然会(x)盔R。注意:(x)p2q赶上p1Ӟp1一定还没走完一遍环路(p2速度是p1的两倍,极限情况是两指针同时从环L(fng)出发Q,而且p2也不?x)跨p1而不盔RQ两者之间的差距逐渐~小Q例??????Q差值是1Q?br>
5.memset的用法:(x)
?include <memory.h> 中,函数原型Q?br>Void *memsetQvoid *bufferQint cQint countQ,其中buffer是分配的内存Qc是初始化内容Qcount是初始化的字节数?br>一般memset把buffer所指向的前count个字节设|成某个字符的ASCLL|一般用于给数组或者字W串{类型赋倹{?br>CZQ?br>memsetQ数l名QintQsizeofQ数l名Q)(j)Q即从v始位|到l止位置Ҏ(gu)l进行赋倹{?br>
6.指定cout默认输出数位数Q?br>#include <iomanip>
//数点后C讄为n
Cout << setiosflags(ios::fixed) << setprecision(n) << 变量;   
//点数精度设|ؓ(f)n
Cout << setiosflags(ios::showpoint) << setprecision(n) << 变量;

7.最大公U数、最公倍数、因子分解等Q?br>最大公U数Q用辗{盔R法,大的?% 的敎ͼ得出余数Q然后辗转相除,直到余数?Q此旉数就是最大公U数?br>最公倍数Q用辗{盔R法求得最大公U数pQ然后两数除以p得商a1、a2Q可知a1和a2中必然不包含公因子(如果包含的话Qp׃是最大公U数?jin)?j)Q所以p*a1*a2是最公倍数?br>因子分解Q对nq行因子分解Qi?开始到数n/2Q如果n能整除iQ说明i是n的因子之一Qƈ循环判断能整除多次iQ然后il箋循环递增。(另外一U简化方法是看最因子p是多,然后循环i?开始到数n/p卛_Q?br>
8.cin.getline和getline的区别:(x)
cin.getline(char*, int)是istreamcd象的成员函数Q需要头文g#include <iostream>才能使用Q主要用于c_stringcdd?br>getline(cin, str)、getline(cin, str, char)是stringcd象的成员函数Q需要头文g#include <string>才能使用Q主要用于stringcddQ后者的char是判断结束符?br>注意Q在VC6.0中,使用getline(cin, str)需要输入两ơ回车才能读入,q是VC6.0的BUGQ在更高U别的版本中不存在该错误?br>
9.scanf/cin和printf/cout的比较:(x)
在做ACM题目的时候,发现使用scanf比cin要快得多Q同理printf比cout要快Q具体原因待查?br>注意scanf的返回值问题:(x)
scanf("%d%d", &a, &b);
如果a和b都被成功dQ那么scanf的返回值就?
如果只有a被成功读入,q回gؓ(f)1
如果a和b都未被成功读入,q回gؓ(f)0
如果遇到错误或遇到end of fileQ返回gؓ(f)EOF?br>所以,在用scanf的时候,(g)查它的返回值来判断scanf是否正确地读C(jin)数据?br>
10.100?0000的整C因子最多的一个数Q?br>Ҏ(gu)Q找?00 <= 2^n <= 10000最大的n卛_。假设某数存在n+1个最大的因子Q那么其中的n个因子之U必然大于等?^nQ于是n+1个因子之U必然大?0000Q证毕?br>
11.一般来_(d)设计E序旉归与堆栈是{h(hun)的,即用堆栈的E序一般可以写成递归形式Q相反亦可?span style="COLOR: red">不考虑E序速度的话Q一般用递归比较?/span>?br>
12.char型数l?br>对于int/double型数l,例如?00个int型变量存储,那么应该定义int data[100]Q其??9用来存储q?00个变量?br>对于char型数l,例如?00个char型变量存储,那么应该定义char data[101]Q其??9用来存储q?00个变量,100用来存储’\0’?br>



q风 2009-08-24 10:18 发表评论
]]>
如何二l数l作为函数的参数传递【{载?/title><link>http://www.shnenglu.com/amazon/archive/2009/08/12/92994.html</link><dc:creator>q风</dc:creator><author>q风</author><pubDate>Wed, 12 Aug 2009 02:25:00 GMT</pubDate><guid>http://www.shnenglu.com/amazon/archive/2009/08/12/92994.html</guid><wfw:comment>http://www.shnenglu.com/amazon/comments/92994.html</wfw:comment><comments>http://www.shnenglu.com/amazon/archive/2009/08/12/92994.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/amazon/comments/commentRss/92994.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/amazon/services/trackbacks/92994.html</trackback:ping><description><![CDATA[<p>原文地址Q?a >http://hi.baidu.com/hsyl/blog/item/7731ae519b151c898d5430f9.html</a><br><br>可以用二l数l名作ؓ(f)实参或者Ş参,在被调用函数中对形参数组定义时可以指定所有维数的大小Q也可以省略W一l的大小说明Q如Q?br>void Func(int array[3][10]);<br>void Func(int array[][10]);<br>二者都是合法而且{h(hun)Q但是不能把W二l或者更高维的大省略,如下面的定义是不合法的:(x)<br>void Func(int array[][]);<br>因ؓ(f)从实参传递来的是数组的v始地址Q在内存中按数组排列规则存放(按行存放)Q而ƈ不区分行和列Q如果在形参中不说明列数Q则pȝ无法军_应ؓ(f)多少行多列Q不能只指定一l而不指定W二l_(d)下面写法是错误的Q?br>void Func(int array[3][]);<br>实参数组l数可以大于形参数组Q例如实参数l定义ؓ(f)Q?br>void Func(int array[3][10]);<br>而Ş参数l定义ؓ(f)Q?br>int array[5][10];<br>q时形参数组只取实参数组的一部分Q其余部分不起作用?/p> <p>大家可以看到Q将二维数组当作参数的时候,必须指明所有维数大或者省略第一l的Q但是不能省略第二维或者更高维的大,q是q译器原理限制的。大家在学编译原理这么课E的时候知道编译器是这样处理数l的Q对于数l:(x) <br>int p[m][n]Q?br>如果要取p[i][j]的?i>=0 && i<m && 0<=j && j < n)Q编译器是这样寻址的,它的地址为:(x)<br>p + i*n + j;<br>从以上可以看出,如果我们省略?jin)第二维或者更高维的大,~译器将不知道如何正的d。但是我们在~写E序的时候却需要用到各个维数都不固定的二维数组作ؓ(f)参数Q这难办了(jin)Q编译器不能识别阿,怎么办呢Q不要着急,~译器虽然不能识别,但是我们完全可以不把它当作一个二l数l,而是把它当作一个普通的指针Q再另外加上两个参数指明各个l数Q然后我们ؓ(f)二维数组手工dQ这样就辑ֈ?jin)将二维数组作?f)函数的参C递的目的Q根据这个思想Q我们可以把l数固定的参数变为维数随即的参数Q例如:(x)<br>void Func(int array[3][10]); <br>void Func(int array[][10]);<br>变ؓ(f)Q?br>void Func(int **array, int m, int n);<br>在{变后的函CQarray[i][j]q样的式子是不对?不信Q大家可以试一?Q因为编译器不能正确的ؓ(f)它寻址Q所以我们需要模仿编译器的行为把array[i][j]q样的式子手工{变ؓ(f)<br>*((int*)array + n*i + j);<br>在调用这L(fng)函数的时候,需要注意一下,如下面的例子Q?br>int a[3][3] = <br>{<br>      {1, 1, 1},<br>      {2, 2, 2},<br>      {3, 3, 3}<br>};<br>Func(a, 3, 3);<br>Ҏ(gu)不同~译器不同的讄Q可能出现warning 或者error,可以q行强制转换如下调用Q?<br>Func((int**)a, 3, 3);<br><br><strong>补充Q?br></strong>对于最后利用指针代替二l数l的做法E显累赘Q只需要一层的指针卛_Q?br>int a[3][3] = <br>{<br>      {1, 1, 1},<br>      {2, 2, 2},<br>      {3, 3, 3}<br>};<br>函数使用如下Q?br>Func((int*)a, 3, 3);<br>函数声明如下Q?br>void Func(int *array, int m, int n);<br>函数中用指针如下:(x)<br>*(array + n*i + j);<br></p> <img src ="http://www.shnenglu.com/amazon/aggbug/92994.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/amazon/" target="_blank">q风</a> 2009-08-12 10:25 <a href="http://www.shnenglu.com/amazon/archive/2009/08/12/92994.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>联合union的某些特?/title><link>http://www.shnenglu.com/amazon/archive/2009/08/11/92955.html</link><dc:creator>q风</dc:creator><author>q风</author><pubDate>Tue, 11 Aug 2009 14:00:00 GMT</pubDate><guid>http://www.shnenglu.com/amazon/archive/2009/08/11/92955.html</guid><wfw:comment>http://www.shnenglu.com/amazon/comments/92955.html</wfw:comment><comments>http://www.shnenglu.com/amazon/archive/2009/08/11/92955.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/amazon/comments/commentRss/92955.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/amazon/services/trackbacks/92955.html</trackback:ping><description><![CDATA[<p>联合union的特征包括:(x)<br>Q?Q不能直接对联合内的元素q行初始化;<br>Q?Q某个时候只能用其中一个元素;<br>Q?Q分配给union的size是其中最大元素的size?br><br>PSQ?span style="COLOR: red">对union中的某元素赋|那么union中其他元素的值又是多呢Q?/span><br>union test<br>{<br> int a;<br> char b;<br>}hh;</p> <p>hh.a = 0;<br>hh.b = -1;<br>cout << hh.a << endl;<br>最后的l果是hh.a = 255。原因是hh.b = -1Ӟ低位字节存储11111111Q补码)(j)Q那么整?个字节就?0000000 00000000 00000000 11111111Q即255。(正数的原码、反码、补码都一P负数的原码不变,反码在原码基上取反,补码在原码基上取反加1Q?/p> <img src ="http://www.shnenglu.com/amazon/aggbug/92955.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/amazon/" target="_blank">q风</a> 2009-08-11 22:00 <a href="http://www.shnenglu.com/amazon/archive/2009/08/11/92955.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sort和qsort的比较分?/title><link>http://www.shnenglu.com/amazon/archive/2009/08/11/92953.html</link><dc:creator>q风</dc:creator><author>q风</author><pubDate>Tue, 11 Aug 2009 13:56:00 GMT</pubDate><guid>http://www.shnenglu.com/amazon/archive/2009/08/11/92953.html</guid><wfw:comment>http://www.shnenglu.com/amazon/comments/92953.html</wfw:comment><comments>http://www.shnenglu.com/amazon/archive/2009/08/11/92953.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/amazon/comments/commentRss/92953.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/amazon/services/trackbacks/92953.html</trackback:ping><description><![CDATA[<p>qsort()定义在头文g<stdlib.h>中:(x)<br>_CRTIMP void __cdecl qsort (void*, size_t, size_t, int (*)(const void*, const void*))<br>qsortQ数l名Q元素个敎ͼ每个元素占用的空_(d)sizeofQ,比较函数Q,其中比较函数是自己写的函敎ͼ遵@int comQconst void *aQconst void *bQ的格式。当a、b关系?>  <  = Ӟ分别q回正?负?Ӟ或者相反)(j)。用const void*而不是char*的原因是Z(jin)可以寚w字符串类型的数D行排序。具体实例如下:(x)</p> <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.shnenglu.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> nn[</span><span style="COLOR: #000000">100</span><span style="COLOR: #000000">],n</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">100</span><span style="COLOR: #000000">;<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> com(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">a,</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">b)<br><img id=Codehighlighter1_56_88_Open_Image onclick="this.style.display='none'; Codehighlighter1_56_88_Open_Text.style.display='none'; Codehighlighter1_56_88_Closed_Image.style.display='inline'; Codehighlighter1_56_88_Closed_Text.style.display='inline';" align=top src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_56_88_Closed_Image onclick="this.style.display='none'; Codehighlighter1_56_88_Closed_Text.style.display='none'; Codehighlighter1_56_88_Open_Image.style.display='inline'; Codehighlighter1_56_88_Open_Text.style.display='inline';" align=top src="http://www.shnenglu.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_56_88_Closed_Text><img src="http://www.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_56_88_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif">    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)a</span><span style="COLOR: #000000">-*</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)b;<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000">    <br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif">qsort((</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)nn,n,</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">),com);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span></div> <p>注意Q缺省是升序排序Q可以通过函数com改变排序序?br><br>sort()定义在在头文?lt;algorithm>中?br>template<typename _RandomAccessIterator><br>void __insertion_sort(_RandomAccessIterator __first, _RandomAccessIterator __last)<br>sort函数是标准模板库的函敎ͼ已知开始和l束的地址卛_q行排序Q可以用于比较Q何容器(必须满随机q代器)(j)QQ何元素,M条gQ执行速度一般比qsort要快。具体事例如下:(x)</p> <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.shnenglu.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> ch[</span><span style="COLOR: #000000">20</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">sdasdacsdasdas</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif">cout</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">ch</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">endl;<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif">sort(ch,ch</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">14</span><span style="COLOR: #000000">);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif">cout</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">ch</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">endl;</span></div> <p>注意Q缺省是升序排序。sort中一个改变排序顺序的例子如下Q?/p> <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.shnenglu.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif">#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">algorithm</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000"> std;<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000"> cmp (</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> a, </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> b)<br><img id=Codehighlighter1_100_117_Open_Image onclick="this.style.display='none'; Codehighlighter1_100_117_Open_Text.style.display='none'; Codehighlighter1_100_117_Closed_Image.style.display='inline'; Codehighlighter1_100_117_Closed_Text.style.display='inline';" align=top src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_100_117_Closed_Image onclick="this.style.display='none'; Codehighlighter1_100_117_Closed_Text.style.display='none'; Codehighlighter1_100_117_Open_Image.style.display='inline'; Codehighlighter1_100_117_Open_Text.style.display='inline';" align=top src="http://www.shnenglu.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_100_117_Closed_Text><img src="http://www.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_100_117_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif">    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> a </span><span style="COLOR: #000000">></span><span style="COLOR: #000000"> b;<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> main()<br><img id=Codehighlighter1_131_235_Open_Image onclick="this.style.display='none'; Codehighlighter1_131_235_Open_Text.style.display='none'; Codehighlighter1_131_235_Closed_Image.style.display='inline'; Codehighlighter1_131_235_Closed_Text.style.display='inline';" align=top src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_131_235_Closed_Image onclick="this.style.display='none'; Codehighlighter1_131_235_Closed_Text.style.display='none'; Codehighlighter1_131_235_Open_Image.style.display='inline'; Codehighlighter1_131_235_Open_Text.style.display='inline';" align=top src="http://www.shnenglu.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_131_235_Closed_Text><img src="http://www.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_131_235_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif">    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> data[</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">];<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif">    </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">; i </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">; i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif">        cin </span><span style="COLOR: #000000">>></span><span style="COLOR: #000000"> data[i];<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif">    sort(data, data </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">, cmp);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif">    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span></div> <img src ="http://www.shnenglu.com/amazon/aggbug/92953.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/amazon/" target="_blank">q风</a> 2009-08-11 21:56 <a href="http://www.shnenglu.com/amazon/archive/2009/08/11/92953.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>匈牙利标记法【{载?/title><link>http://www.shnenglu.com/amazon/archive/2008/12/29/70674.html</link><dc:creator>q风</dc:creator><author>q风</author><pubDate>Mon, 29 Dec 2008 07:34:00 GMT</pubDate><guid>http://www.shnenglu.com/amazon/archive/2008/12/29/70674.html</guid><wfw:comment>http://www.shnenglu.com/amazon/comments/70674.html</wfw:comment><comments>http://www.shnenglu.com/amazon/archive/2008/12/29/70674.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/amazon/comments/commentRss/70674.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/amazon/services/trackbacks/70674.html</trackback:ping><description><![CDATA[<p>匈牙利表C法Q它通过在每一个表C符名字的前面放|一个数据类型助记符Qؓ(f)E序员提供了(jin)Ҏ(gu)识符的即时识别?br><br>?》MFC、句柄、控件及(qing)l构的命名规则?br>     Windowscd  h变量    MFCc?nbsp;       h对象<br>     HWND         hWnd        CWnd*        pWnd<br>     HDLG         hDlg        CDialog*     pDlg<br>     HDC          hDC         CDC*         pDC<br>     HGDIOBJ      hGdiObj     CGdiObject*  pGdiObj<br>     HPEN         hPen        CPen*        pPen<br>     HBRUSH       hBrush      CBrush*      pBrush<br>     HFONT        hFont       CFont*       pFont<br>     HBITMAP      hBitmap     CBitmap*     pBitmap<br>     HPALETTE     hpalette    CPalette*    pPalette<br>     HRGN         hRgn        CRgn*        pRgn<br>     HMENU        hMenu       CMenu*       pMenu<br>     HWND         hCtl        CState*      pState<br>     HWND         hCtl        CButton*     pButton<br>     HWND         hCtl        CEdit*       pEdit       <br>     HWND         hCtl        CListBox*    pListBox<br>     HWND         hCtl        CComboBox*   pComboBox<br>     HWND         hCtl        CScrollBar*  pScrollBar<br>     HSZ          hszStr      CString      pStr<br>     POINT        pt          CPoint       pt<br>     SIZE         size        CSize        size<br>     RECT         rect        CRet         rect<br>    <br>?》一般前~命名规范<br>     前缀      cd          实例<br>     C         cLl构      CDocument,CPrintInfo<br>     m_        成员变量      m_pDoc, m_nCustomers<br><br>?》变量名规范<br>     前缀  cd     描述                                    实例<br>     ch    char     8为字W?nbsp;                                chGrade<br>     ch    TCHAR    如果_UNICODE定义Qؓ(f)16位字W?nbsp;           chName<br>     b     BOOL     布尔?nbsp;                                 bEnabled<br>     n     int      整型Q其大小依赖于操作系l)(j)            nLength<br>     n     UNIT     无符号|其大依赖于操作pȝQ?nbsp;       nLength<br>     w     WORD     16位无W号?nbsp;                           wPos<br>     l     LONG     32位有W号整型                          lOffset<br>     dw    DWORD    32位无W号整型                          dwRange<br>     p     *        指针                                    pDoc<br>     lp    FAR*     q指?nbsp;                                 lpDoc<br>     lpsz  LPSTR     32位字W串指针                         lpszName<br>     lpsz  LPCTSTR   如果_UNICODE定义Q位32位常量字W串指针 lpszName<br>     h     handle    Windows对象句柄                        hWnd<br>     lpfn  callback  指向CALLBACK函数的远指针               lpfnAbort<br><br>?》应用程序符号命名规?br>     前缀       W号cd                       实例              范围<br>     IDR_       不同cd的多个资源共享标?nbsp;    IDR_MAINFRAME     1-0x6FFF<br>     IDD_       对话框资?nbsp;                    IDD_SPELL_CHECK   ...<br>     HIDD_      对话框资源的Help上下?nbsp;        HIDD_SPELL_CHECK  0X20001-0X26FF<br>     IDB_       位图资源                       IDB_COMPANY_LOGO  1-0X6FFF<br>     IDC_       光标资源                       IDC_PENCIL        ...<br>     IDI_       图表资源                       IDI_NOTEPAD       ...<br>     ID_        来自菜单Ҏ(gu)工具栏的命o(h)       ID_TOOLS_SPELLING 0x8000-0xDFFF <br>     HID_       命o(h)Help上下?nbsp;                HID_TOOLS_SPELLING ...<br>     IDP_       消息框提C?nbsp;                    IDP_INVALID_PARINO 8-0xDFFF<br>     HIDP_      消息框Help上下?nbsp;              HIDP_INVALID_PARINO 0X30008-0x3DFFF<br>     IDS_       串资?nbsp;                        IDS_COPYRIGHT       1-0x7FFF<br>     IDC_       对话框内的控?nbsp;                IDC_RECALC          8-0xDFFF<br><br>?》Microsoft MFC宏命名规?br>     名称     cd<br>     _AFXDLL  唯一的动态连接库QDynamic Link LibraryQ版?br>     _ALPHA   仅编译DEC Alpha处理?br>     _DEBUG   包括诊断的调式版?br>     _MBCS    ~译多字节字W集<br>     _UNICODE 在一个应用程序中打开Unicode<br>     AFXAPI   MFC提供的函?br>     CALLBACK 通过指针回调的函?br><br>?》库标识命名规范<br>     指示W?nbsp;  值和含义<br>     u        ANSIQNQ或UnicodeuQUQ?br>     d        调试或发行:(x)D=调式Q忽略指C符为发?br><br>?》静(rn)态库版本命名规范<br>     ?nbsp;            描述<br>     NAFXCWD.LIB    调试版本QMFC?rn)态连接库<br>     NAFXCW.LIB     发行...<br>     UAFXCWD.LIB    调试版本Q具有Unicode支持的MFC?rn)态连接库<br>     UAFXCW.LIB     发行...<br>    <br>?》动态库q接命名规范<br>     名称     cd<br>     _AFXDLL  唯一的动态连接库QDLLQ版?br>     WINAPI   Windows所提供的函?br>    <br>?》Windows.h命名规范<br>     cd定义      描述<br>     WINAPI        使用在API 声明的FAR PASCAL位置Q如果正在编写一个具有导出API入口点的DLLQ则可以?br>                   自己的API中用该cd<br>     CALLBACK      使用在应用程序回叫例E如H口和对话框中的FAR PASCAL位置<br>     LPCSTR        与LPSTR相同Q只是LPCSTR用于只读串指针,其定义类gQconst char FAR*Q?br>     UNIT          与可Ud的无符h型类型,其大由L环境军_Q对Windows NT和W(xu)indows 95?2位)(j)?br>                   它是unsigned int的同义词Q用WORD位置Q在一?2位的q_上希望得C?6为无W号?br>                   的极数情况除外<br>     LRESULT       H口E序q回值的cd<br>     LPARAM        声明lParam所使用的类型,lParam 是窗口程序的W四个参?br>     WPARAM        声明wParam所使用的类型, wParam是窗口程序的W三个参敎ͼ一U组合数据类型)(j)<br>     LPVOID        一般的指针cdQ与Qvoid*Q等同。应该用它来代替LPSTR?br><br><br></p> <img src ="http://www.shnenglu.com/amazon/aggbug/70674.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/amazon/" target="_blank">q风</a> 2008-12-29 15:34 <a href="http://www.shnenglu.com/amazon/archive/2008/12/29/70674.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++q阶必读书籍【{载?/title><link>http://www.shnenglu.com/amazon/archive/2008/12/29/70665.html</link><dc:creator>q风</dc:creator><author>q风</author><pubDate>Mon, 29 Dec 2008 06:17:00 GMT</pubDate><guid>http://www.shnenglu.com/amazon/archive/2008/12/29/70665.html</guid><wfw:comment>http://www.shnenglu.com/amazon/comments/70665.html</wfw:comment><comments>http://www.shnenglu.com/amazon/archive/2008/12/29/70665.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/amazon/comments/commentRss/70665.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/amazon/services/trackbacks/70665.html</trackback:ping><description><![CDATA[<p><strong>Q一Q语a入门:<br></strong><br>《C++ Primer?br>最新版本:(x)W三版(W四版国外已上架Q国内一些网上书店也在预订中Q?br>适合有丰富Cl验Q缺乏C++l验的。不q我个h一直认为此书带着q于强烈的C语言的痕q,对于C++的学?fn)未必是好事?/p> <p>《The C++ Programming Language?《C++E序设计语言?br>最新版本:(x)W三版特别版<br>UTC++PLQ有其他语言的丰富经验的。(也有人简UC?#8220;TCPL”Q但需与另一本《The C Programmer Language》区分开来)(j)</p> <p>《Essential C++?br>《Accelerated C++?br>q两本薄一些,都是不错的选择。《Accelerated C++》本人没有读q,从各斚w的评h看,完全值得推荐?/p> <p>以上几本书都有相应的中文版,而且译的质量都不错。上面的书未必都需要读一遍,但无论如何,TC++PL是应该阅ȝ?br><br><strong>Q二Q进阶AQ?/strong><br>q个路线侧重于语a本n</p> <p>《Effective C++?br>最新版本:(x)W二版(W三版国外已上架Q国内一些网上书店也在预订中Q?br>UEC。C++E序员必读!很多时候,我们说C++圣经不是指TC++PLQ而是q一本。《The Pragmatic Programmer》一书中写到Q?#8220;一旦你发现自己要参与C++目的开发,赶快跑(不要赎ͼ(j)C店去购买Scott Mayer的《Effective C++》,可能q要《More Effective C++?#8221;?/p> <p>《C++ Coding Standards: 101 Rules, Guidelines, and Best Practices?《C++ ~程规范?br>个h认ؓ(f)此书应ؓ(f)C++E序员必备的案头书。几乎Effectivepd和Exceptionalpd都在q里得到?jin)ȝ。最新的模版、异常的业界l验都在q里的到?jin)体现。可能的唯一~陷是对一个新手而言Q关?#8220;Z么这么做”的问题,解释的不够?br>我的看法是:(x)如果你不理解其中的条ƾ,记忆Qƈ且照做;如果你理解其中的条款Q我猜你一定会(x)同意书中的观炏V我认ؓ(f)q本书中的内容至在2009q以前都不会(x)q时Qh们将qؓ(f)传诵它制定的101条戒律?br>q不知道他的Uͼ也许“101”?x)成Z个候选者? </p> <p>提到《Effective C++》,那么另外三本书一一出水面Q?br>《More Effective C++?br>《Exceptional C++?br>《More Exceptional C++》?br>C《Exceptional C++ Style》也是值得一看的好书?br>上述几本书,一本也不应该放q?br>个h上述书籍按顺序阅诅Rƈ且,在将来反复阅读这几本书?br><br><strong>Q三Q进阶BQ?/strong><br>q个路线侧重于程序库?</p> <p>《The C++ Standard Library?《C++标准E序库—自修教E与参考手册?br>听说qSTL吗?q本书会(x)教你最基本的,也是最重要的STL的用。这本书Q应该是必读的?/p> <p>《Effective STL?br>?x)用STLq不够,q必ȝ道什么时候选择什么STLlgQ这是STL使用的必M?/p> <p>《Generic Programming and the STL: Using and Extending the C++ Standard Template Library?《泛型编E与STL》?br>q本书理论性较强,但是真的很严谨,而且q不是非帔R懂。理解其中对于Concept的解释,是非常重要的?</p> <p>《C++ STL?br>q不是讲qC用程序库的,而是讲述E序库实现原理的。肠胃不好的Q需要慢慢吸收?/p> <p>q个路线的书Q仍然是按顺序阅诅R?br>q阶A、进阶B两个路线应该是可以ƈ行的?br><br><strong>其他q阶参考书</strong><br>提出q些参考书Q只是避免争议,也ؓ(f)开阔视野,W者ƈ不曾完全读过所有的?/p> <p>《Thinking in C++?《C++~程思想?br>q本书及(qing)其中文版传言好坏都有Q没有认真看q,不做评h(hun)Q如果确有兴,不妨试一下该书?/p> <p>以下几本书基本上涉及(qing)的都是语a本nQ大体上可以按照以下的顺序阅诅R?/p> <p>《C++必知必会(x)?br>如果早一q_(d)q本书将是重量的,然而它?01和《Exceptional C++ Style》盖q一头?/p> <p>《C++ Gotchas: Avoiding Common Problems in Coding and Design?《C++E序设计陷阱?br>q又是一本我未曾读过Q而且q受好评的书?/p> <p>《STL 源码剖析?br>q本书我刚到手,p??赎ͼ以至于到现在也没有看q。看q这本书的朋友,可以l一个合适的评h(hun)?</p> <p>高Q?br>《The Design and Evolution of C++?《C++语方的设计和演化?br>UD&EQ内容ƈ不艰深,Bjarne的书Q仅此,值得一诅R?br>前段旉Q互动网?块一本(人民币)(j)贱卖此书Q现在好像没?jin)?/p> <p>《Inside The C++ Object Model?《深度探索C++对象模型?br>CE序员读后一定会(x)觉得C++原来q不秘?/p> <p>《C++ Template?br>在阅读STL、Boost或者Loki的源代码之前Q请仔细阅读本书Q它可以减轻一些阅ȝ?ch)恼。这本书是讨论C++模版的权威?</p> <p>《Modern C++ Design Generic Programming and Design Patterns Applied?《C++设计新思维——泛型编E与设计模式之应用?br>UMCD。在阅读MCD之前Q徏议先阅读一下《C++ Template》?/p> <p>《对象揭U:(x)Java、Eiffel和C++?br>你对C++不满吗?q本书可以部分地帮你完成抱怨的目标。也许它q可以让你不q信C++?/p> <p>最后,一份C++标准文档也是应该加以咀嚼的?<br>q有一些书c,q不能简单的归于C++Q也难以在纯_的书本学习(fn)中加以掌握。《Design Patterns?《设计模式》一书就归于此类?/p> <p>所有上q的书籍Q要么谈论C++语言本nQ要么谈论STL的,要么D有之(当然严格讲STL也是C++语言非常重要的一部分Q。偶?dng),某些书中条目也?x)涉及(qing)实际工程。这些书q不是C++软g开发的全部Q但是他们很重要。阅读这些书Q未必需要化费太多的_֊Q有时候是?x)困难,但也有时候会(x)很快速?br>最后,~程语言q计算机科学技术的全部Q尤其对于在校的学生来说Q打好基、开阔视野都是非帔R要的?<br><br><br></p> <img src ="http://www.shnenglu.com/amazon/aggbug/70665.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/amazon/" target="_blank">q风</a> 2008-12-29 14:17 <a href="http://www.shnenglu.com/amazon/archive/2008/12/29/70665.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ZWIN32 API?qing)MFC的多U程技?/title><link>http://www.shnenglu.com/amazon/archive/2008/11/27/67989.html</link><dc:creator>q风</dc:creator><author>q风</author><pubDate>Thu, 27 Nov 2008 08:30:00 GMT</pubDate><guid>http://www.shnenglu.com/amazon/archive/2008/11/27/67989.html</guid><wfw:comment>http://www.shnenglu.com/amazon/comments/67989.html</wfw:comment><comments>http://www.shnenglu.com/amazon/archive/2008/11/27/67989.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/amazon/comments/commentRss/67989.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/amazon/services/trackbacks/67989.html</trackback:ping><description><![CDATA[32位Windows环境下的Win32 API提供?jin)多U程应用E序开发所需要的接口函数Q而相应的MFCcd装?jin)多U程~程的类Q用户在开发时可根据应用程序的需要和特点选择相应的工兗以下将概括归纳ZWIN32 API和MFC的多U程技术,以及(qing)U程通信的实现方法?br><br><strong>WIN32 API下多U程~程</strong><br><br>1.U程创徏Q该函数在其调用q程的进E空间里创徏一个新的线E,q返回已建线E的句柄?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.shnenglu.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">HANDLE CreateThread(<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif">                                       LPSECURITY_ATTRIBUTES lpThreadAttributes,<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif">                                       DWORD dwStackSize,<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif">                                       LPTHREAD_START_ROUTINE lpStartAddress,<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif">                                       LPVOID lpParameter,<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif">                                       DWORD dwCreationFlags,<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif">                                       LPDWORD lpThreadId<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif">                                       );</span></div> <p>其中各参数说明如下:(x)<br><span style="FONT-FAMILY: wingdings">l</span>lpThreadAttributesQ指向一?SECURITY_ATTRIBUTES l构的指针,该结构决定了(jin)U程的安全属性,一般置?NULLQ?<br><span style="FONT-FAMILY: wingdings">l</span>dwStackSizeQ指定了(jin)U程的堆栈深度,一般都讄?Q表C线E堆栈大与创徏它的U程相同Q?<br><span style="FONT-FAMILY: wingdings">l</span>lpStartAddressQ表C新U程开始执行时代码所在函数的地址Q即U程的v始地址。一般情况ؓ(f)(LPTHREAD_START_ROUTINE)ThreadFuncQThreadFunc 是线E函数名Q函数原型如下:(x)<br> DWORD  WINAPI  threadfunc(LPVOID  param);<br><span style="FONT-FAMILY: wingdings">l</span>lpParameterQ指定了(jin)U程执行时传送给U程?2位参敎ͼ即线E函数的参数Q?<br><span style="FONT-FAMILY: wingdings">l</span>dwCreationFlagsQ控制线E创建的附加标志Q可以取两种倹{如果该参数?Q线E在被创建后׃(x)立即开始执行;如果该参Cؓ(f)CREATE_SUSPENDED,则系l生线E后Q该U程处于挂v状态,q不马上执行Q直臛_数ResumeThread被调用; <br><span style="FONT-FAMILY: wingdings">l</span>lpThreadIdQ该参数q回所创徏U程的IDQ?/p> <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.shnenglu.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">DWORD WINAPI Func1(LPVOID param)<br><img id=Codehighlighter1_33_113_Open_Image onclick="this.style.display='none'; Codehighlighter1_33_113_Open_Text.style.display='none'; Codehighlighter1_33_113_Closed_Image.style.display='inline'; Codehighlighter1_33_113_Closed_Text.style.display='inline';" align=top src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_33_113_Closed_Image onclick="this.style.display='none'; Codehighlighter1_33_113_Closed_Text.style.display='none'; Codehighlighter1_33_113_Open_Image.style.display='inline'; Codehighlighter1_33_113_Open_Text.style.display='inline';" align=top src="http://www.shnenglu.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_33_113_Closed_Text><img src="http://www.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_33_113_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif">    cout </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">test</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> endl;<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif">    MessageBox(NULL, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">test</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">"title</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, MB_OK);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif">    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> main()<br><img id=Codehighlighter1_127_291_Open_Image onclick="this.style.display='none'; Codehighlighter1_127_291_Open_Text.style.display='none'; Codehighlighter1_127_291_Closed_Image.style.display='inline'; Codehighlighter1_127_291_Closed_Text.style.display='inline';" align=top src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_127_291_Closed_Image onclick="this.style.display='none'; Codehighlighter1_127_291_Closed_Text.style.display='none'; Codehighlighter1_127_291_Open_Image.style.display='inline'; Codehighlighter1_127_291_Open_Text.style.display='inline';" align=top src="http://www.shnenglu.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_127_291_Closed_Text><img src="http://www.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_127_291_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif">    HANDLE p;<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif">    DWORD a </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">;<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif">    DWORD id </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif">    p </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> CreateThread(NULL, </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">, (LPTHREAD_START_ROUTINE)Func1, </span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">a, </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">id);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif">    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">WaitForSingleObject(p, INFINITE);</span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif">    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span></div> <p><br>2.U程(zhn)挂和恢复:(x)创徏新的U程后,该线E就开始启动执行。但如果在dwCreationFlags中用了(jin)CREATE_SUSPENDEDҎ(gu),U程q不马上执行Q而是先挂P{到调用ResumeThread后才开始启动线E?/p> <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.shnenglu.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">DWORD SuspendThread(HANDLE hThread);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">该函数用于挂h定的U程Q如果函数执行成功,则线E的执行被终止?/span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">DWORD ResumeThread(HANDLE hThread);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">该函数用于结束线E的挂v状态,执行U程?/span></div> <p><br>3.U程优先U操作:(x)</p> <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.shnenglu.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> GetThreadPriority(HANDLE hThread);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">调用该函数得到线E优先权?/span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">BOOL SetThreadPriority(HANDLE hThread,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> nPriority); <br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">调用该函数来讄U程的优先权?/span></div> <p><br>4.U程退出:(x)当调用线E的函数q回后,U程自动l止?/p> <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.shnenglu.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #008000">//</span><span style="COLOR: #008000">如果需要在U程的执行过E中l止则可调用函数Q?nbsp;</span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">VOID ExitThread(DWORD dwExitCode); <br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">如果在线E的外面l止U程Q则可调用下面的函数Q?nbsp;</span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">BOOL TerminateThread(HANDLE hThread,DWORD dwExitCode); </span></div> <p>注意Q?br><span style="COLOR: red">(1)TerminateThread函数可能?x)引L(fng)l不E_Q而且U程所占用的资源也不释放。因此,一般情况下Q徏议不要用该函数?<br>(2)如果要终止的U程是进E内的最后一个线E,则线E被l止后相应的q程也应l止?<br>(3)释放资源后,线EHANDLE|成NULL?br>(4)使用TerminateThread后,需调用CloseHandle( )函数释放U程所占用的堆栈?/span><br><br><br><strong>MFC下多U程~程之工作线E编E?/strong><br><br>1.U程创徏Q?/p> <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.shnenglu.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">CWinThread</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">AfxBeginThread( <br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif">                                                AFX_THREADPROC pfnThreadProc, <br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif">                                                LPVOID pParam,<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif">                                                </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> nPriority </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> THREAD_PRIORITY_NORMAL,<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif">                                                UINT nStackSize </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif">                                                DWORD dwCreateFlags </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">, <br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif">                                                LPSECURITY_ATTRIBUTES lpSecurityAttrs </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> NULL);</span></div> <p>各参数如下:(x)<br><span style="FONT-FAMILY: wingdings">l</span>参数pfnThreadProc是线E执行体函数Q函数原形ؓ(f): UINT ThreadFunction( LPVOID pParam)?<br><span style="FONT-FAMILY: wingdings">l</span>参数pParam是传递给执行函数的参敎ͼ <br><span style="FONT-FAMILY: wingdings">l</span>参数nPriority是线E执行权限,可选|(x) <br>THREAD_PRIORITY_NORMAL、THREAD_PRIORITY_LOWEST、THREAD_PRIORITY_HIGHEST、THREAD_PRIORITY_IDLE?<br><span style="FONT-FAMILY: wingdings">l</span>参数dwCreateFlags是线E创建时的标志,可取值CREATE_SUSPENDEDQ表C线E创建后处于挂v状态,调用ResumeThread函数后线El运行,或者取?#8220;0”表示U程创徏后处于运行状态?<br><span style="FONT-FAMILY: wingdings">l</span>q回值是CWinThreadcd象指针,它的成员变量m_hThread为线E句柄,在Win32 API方式下对U程操作的函数参数都要求提供U程的句柄,所以当U程创徏后可以用所有Win32 API函数对pWinThread->m_ThreadU程q行相关操作?<br><br><span style="COLOR: red">注意Q如果在一个类对象中创建和启动U程Ӟ应将U程函数定义成类外的全局函数Q或者类中的?rn)态函C乎也可以Q?/span><br><br>2.U程(zhn)挂和恢?/ 优先U操作:(x)同上?br><br>3.U程退出:(x)当调用线E的函数q回后,U程自动l止?/p> <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.shnenglu.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #008000">//</span><span style="COLOR: #008000">U程可以在自w内部调用来l止自n的运行?/span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> AfxEndThread(UINT nExitCode, BOOL bDelete </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> TRUE);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">可以在线E的外部调用来强行终止一个线E的q行?/span><span style="COLOR: #008000"><br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">BOOL TerminateThread( HANDLE hThread, DWORD dwExitCode );</span></div> <dl> <dt> <p>注意Q?br><span style="COLOR: red">(1)使用TerminateThread后,需调用CloseHandle( )函数释放U程所占用的堆栈?br>(2)释放资源后,线EHANDLE|成NULL?br></span><br><br><strong>q程间通信</strong><br><br>1.全局变量方式Q?br>(1)q程和线E共享全局变量Q可利用该全局变量辑ֈ通信的目的?br>(2)进E的HADNLE作ؓ(f)参数传递给U程函数Q然后线E可Ҏ(gu)此HANDLE对进E的变量q行操作?br><br>2.消息通信方式Q?/p> <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.shnenglu.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">BOOL PostMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif">BOOL PostThreadMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);<br><img align=top src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif"></span></div> 昄它们发送到的对象不同:(x)PostMessage发消息给H口QPostThreadMessage发消息给U程。且当P(yng)ostThreadMessage的hWnd = NULLӞ表明该消息传递给当前U程本n?nbsp;<br>BOOL   PostMessage(   UINT   message,   WPARAM   wParam   =   0,   LPARAM   lParam   =0   );   <br>q回值如果公布了(jin)消息Q则q回非零|否则q回0?nbsp;  <br>参数message指定?jin)要公布的消息?nbsp;  <br>wParam指定?jin)附加的消息信息。这个参数的内容依赖于要公布的消息?nbsp;  <br>lParam指定?jin)附加的消息信息。这个参数的内容依赖于要公布的消息?nbsp;  <br>说明Q这个函数将一个消息放入窗口的消息队列Q然后直接返回,q不{待对应的窗口处理消息。消息队列中的消息是通过调用Windows的GetMessage或PeekMessage函数来获得的。可以通过Windows的PostMessage函数来访问其它应用程序?nbsp;  <br>    <br>BOOL   PostThreadMessage(   UINT   message   ,   WPARAM   wParam,   LPARAMlParam   );q回值如果成功,则返回非零|否则q回0?nbsp;  <br>参数message用户自定义消息的ID?nbsp;  <br>wParamW一个消息参数?nbsp;  <br>lParamW二个消息参数?nbsp;  <br>说明Q调用这个函C向其它CWinThread对象发送一个用戯定义消息。发送的消息通过消息映射宏ON_THREAD_MESSAGE被映到适当的消息处理函数?nbsp;  <br><br>3.同步方式Q具体参?a href="http://www.shnenglu.com/andxie99/archive/2006/10/10/13517.html">http://www.shnenglu.com/andxie99/archive/2006/10/10/13517.html</a>?br><br><br></dt></dl> <img src ="http://www.shnenglu.com/amazon/aggbug/67989.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/amazon/" target="_blank">q风</a> 2008-11-27 16:30 <a href="http://www.shnenglu.com/amazon/archive/2008/11/27/67989.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Relationship: char, wchar_t, TCHAR, _T(), wstring, stringhttp://www.shnenglu.com/amazon/archive/2008/11/27/67958.htmlq风q风Wed, 26 Nov 2008 16:56:00 GMThttp://www.shnenglu.com/amazon/archive/2008/11/27/67958.htmlhttp://www.shnenglu.com/amazon/comments/67958.htmlhttp://www.shnenglu.com/amazon/archive/2008/11/27/67958.html#Feedback0http://www.shnenglu.com/amazon/comments/commentRss/67958.htmlhttp://www.shnenglu.com/amazon/services/trackbacks/67958.html
char :

单字节变量类型,最多表C?56个字W,在ANSI C中包括:(x)26 lowercase letters, 26 uppercase letters, 10 digits, 32 symbols, 33 control codes, and a space, for a total of 128 codes.

wchar_t :

宽字节变量类型,用于表示Unicode字符Q它实际定义?lt;string.h>里:(x)typedef unsigned short wchar_t?br>
定义宽字节类型方法如下:(x)
wchar_t c = `A' ; 
wchar_t * p = L"Hello!" ; 
wchar_t a[] 
= L"Hello!" ; 
其中Q宽字节cd每个变量占用2个字节,故上q数la的sizeof(a) = 14?br>
TCHAR / _T( ) :

TCHAR.H provides a set of alternative names for the normal run-time library functions requiring string parameters (for example, _tprintf and _tcslen). These are sometimes referred to as "generic"function names because they can refer to either the Unicode or non-Unicode versions of the functions. TCHAR.H also solves the problem of the two character data types with a new data type named TCHAR.

如果在程序中既包括ANSI又包括Unicode~码Q需要包括头文gtchar.h。TCHAR是定义在该头文g中的宏,它视你是否定义了(jin)_UNICODE宏而定义成Q?br>定义?jin)_UNICODEQ?nbsp;   typedef wchar_t TCHAR ;
没有定义_UNICODEQ?typedef char TCHAR ;

_T( )也是定义在该头文件中的宏Q视是否定义?jin)_UNICODE宏而定义成Q?br>定义?jin)_UNICODEQ?nbsp;   #define _T(x)  L##x
没有定义_UNICODEQ?#define _T(x)  x

注意Q如果在E序中用了(jin)TCHARQ那么就不应该用ANSI的strXXX函数或者Unicode的wcsXXX函数?jin),而必M用tchar.h中定义的_tcsXXX函数?br>

以strcpy函数Z子,ȝ一下:(x)

//如果你想使用ANSI字符Ԍ那么请用这一套写法:(x)
char szString[100];
strcpy(szString,
"test");
//如果你想使用Unicode字符Ԍ那么请用这一套:(x)
wchar_t szString[100];
wcscpy(szString,L
"test");
//如果你想通过定义_UNICODE宏,而编译ANSI或者Unicode字符串代码:(x)
TCHAR szString[100];
_tcscpy(szString,_TEXT(
"test"));

string / wstring :

string和wstring均定义在string头文件中Q其中stringcd变量中每个单元ؓ(f)char型字W,wstring为wchar_t型字W?br>定义Ҏ(gu)如下Q?br>string str("abcd");
wstring wstr(L"中国?);

各{换方法:(x)
//char* to string : 
char *= "abcde";
string str = a;

//string to char*
char *= str.c_str();

//wchar_t* to wstring
wchar_t *= L"abcde";
wstring wstr 
= b;

//wstring to wchar_t*
wchar_t *= wstr.c_str();

//wstring to string 
std::string ws2s(const std::wstring& ws)
{
    std::
string curLocale = setlocale(LC_ALL, NULL);      
        setlocale(LC_ALL, 
"chs");
        
const wchar_t* _Source = ws.c_str();
        size_t _Dsize 
= 2 * ws.size() + 1;
        
char *_Dest = new char[_Dsize];
        memset(_Dest,
0,_Dsize);
        wcstombs(_Dest,_Source,_Dsize);
        std::
string result = _Dest;
        delete []_Dest;
        setlocale(LC_ALL, curLocale.c_str());

        
return result;
}


//string to wstring
std::wstring s2ws(const std::string& s)
{
      setlocale(LC_ALL, 
"chs"); 
      
const char* _Source = s.c_str();
      size_t _Dsize 
= s.size() + 1;
      wchar_t 
*_Dest = new wchar_t[_Dsize];
      wmemset(_Dest, 
0, _Dsize);
      mbstowcs(_Dest,_Source,_Dsize);
      std::wstring result 
= _Dest;
      delete []_Dest;
      setlocale(LC_ALL, 
"C");

      
return result;
}






q风 2008-11-27 00:56 发表评论
]]>
Ⱦþۺ| ɫۺɫþû| ɫվþav| Ʒþþþþù| þۺϾƷþ| Ʒ99þþþþè| ҹƷþ| AVɫۺϾþAVɫۺ| þþƷ| ģ˽ĹƷþ| þþƷëƬѹۿ| ٸþĻ| þþ97ɫ | ĻƷѾþ| Ļɫ͵͵þ| 91ƷùۺϾþ | þþƷݲݲ| 99ƷѾþþþþ| ҹþӰԺ| avպƷþþþþa| 99þþù| պһþ| Ʒþþþþù| þùѹۿƷ3| ˾þþƷһ| þ| ɫۺϾþɫ| þþþùƷ| Ʒþ߹ۿ| ˾þۺϾƷAVר| ޹պŷþ| þݺҹҹav˳| ƷˮҾþþþþþ| ƷۺϾþ| 㽶þһ޶ӰԺ| ھƷ˾þþþAVӰԺ| avҹһƬѿþ| Ʒþþþþ| 99þþþþѿ| þþۺϾɫۺ98| ޺ݺۺϾþ|