﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-textbox-随笔分类-c++/c</title><link>http://www.cnitblog.com/textbox/category/8651.html</link><description /><language>zh-cn</language><lastBuildDate>Sun, 15 Jul 2012 09:40:40 GMT</lastBuildDate><pubDate>Sun, 15 Jul 2012 09:40:40 GMT</pubDate><ttl>60</ttl><item><title>Recv与Send的超时 </title><link>http://www.cnitblog.com/textbox/archive/2012/07/14/82931.html</link><dc:creator>零度</dc:creator><author>零度</author><pubDate>Sat, 14 Jul 2012 08:30:00 GMT</pubDate><guid>http://www.cnitblog.com/textbox/archive/2012/07/14/82931.html</guid><wfw:comment>http://www.cnitblog.com/textbox/comments/82931.html</wfw:comment><comments>http://www.cnitblog.com/textbox/archive/2012/07/14/82931.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/textbox/comments/commentRss/82931.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/textbox/services/trackbacks/82931.html</trackback:ping><description><![CDATA[
		<h2 class="title content-title">用setsockopt()来控制recv()与send()的超时</h2>
		<p>在send(),recv()过程中有时由于网络状况等原因，收发不能预期进行,而设置收发超时控制： <br />在Linux下需要注意的是时间的控制结构是struct timeval而并不是某一整型数，<br />int nNetTimeout=1000;//1秒， <br />//设置发送超时 <br />setsockopt(socket，SOL_SOCKET,SO_SNDTIMEO，(char *)&amp;nNetTimeout,sizeof(int)); <br />//设置接收超时 <br />setsockopt(socket，SOL_SOCKET,SO_RCVTIMEO，(char *)&amp;nNetTimeout,sizeof(int)); <br />这样做在Linux环境下是不会产生效果的，须如下定义：struct timeval timeout = {3,0}; <br />//设置发送超时 <br />setsockopt(socket，SOL_SOCKET,SO_SNDTIMEO，(char *)&amp;timeout,sizeof(struct timeval)); <br />//设置接收超时 <br />setsockopt(socket，SOL_SOCKET,SO_RCVTIMEO，(char *)&amp;timeout,sizeof(struct timeval)); <br />有两点注意就是： <br />1）recv
 
()的第四个参数需为MSG_WAITALL，在阻塞模式下不等到指定数目的数据不会返回，除非超时时间到。还要注意的是只要设置了接收超时，在没有
MSG_WAITALL时也是有效的。说到底超时就是不让你的程序老在那儿等，到一定时间进行一次返回而已。 <br />2）即使等待超时时间值未到，但对方已经关闭了socket， 则此时recv()会立即返回，并收到多少数据返回多少数据。</p>
<img src ="http://www.cnitblog.com/textbox/aggbug/82931.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/textbox/" target="_blank">零度</a> 2012-07-14 16:30 <a href="http://www.cnitblog.com/textbox/archive/2012/07/14/82931.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MFC類圖</title><link>http://www.cnitblog.com/textbox/archive/2010/07/08/67266.html</link><dc:creator>零度</dc:creator><author>零度</author><pubDate>Thu, 08 Jul 2010 03:59:00 GMT</pubDate><guid>http://www.cnitblog.com/textbox/archive/2010/07/08/67266.html</guid><wfw:comment>http://www.cnitblog.com/textbox/comments/67266.html</wfw:comment><comments>http://www.cnitblog.com/textbox/archive/2010/07/08/67266.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/textbox/comments/commentRss/67266.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/textbox/services/trackbacks/67266.html</trackback:ping><description><![CDATA[
		<img src="http://www.cnitblog.com/images/cnitblog_com/textbox/8457/o_ws8s10w4.Local_634812067_vc369q1%28zh-cn,VS.80%29.gif" />
<img src ="http://www.cnitblog.com/textbox/aggbug/67266.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/textbox/" target="_blank">零度</a> 2010-07-08 11:59 <a href="http://www.cnitblog.com/textbox/archive/2010/07/08/67266.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>char 转wchar_t 及wchar_t转char  (转)</title><link>http://www.cnitblog.com/textbox/archive/2010/03/16/64672.html</link><dc:creator>零度</dc:creator><author>零度</author><pubDate>Tue, 16 Mar 2010 06:18:00 GMT</pubDate><guid>http://www.cnitblog.com/textbox/archive/2010/03/16/64672.html</guid><wfw:comment>http://www.cnitblog.com/textbox/comments/64672.html</wfw:comment><comments>http://www.cnitblog.com/textbox/archive/2010/03/16/64672.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnitblog.com/textbox/comments/commentRss/64672.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/textbox/services/trackbacks/64672.html</trackback:ping><description><![CDATA[
		<h3 class="title pre fs1">char 转wchar_t 及wchar_t转char</h3>原文来自 http://haofu123.blog.163.com/blog/static/178294920096243161997/<p style="text-indent: 2em;">利用widechartomultibyte来转换的函数</p><p style="text-indent: 2em;">通常适合于window平台上使用</p><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">#include </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">tchar.h</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /><br />#include </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">windows.h</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /><br /></span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> _tmain(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> argc, _tchar</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);"> argv[])<br /><br />{<br /><br />wchar_t pwstr[] </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">l</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">我是中国人</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br /><br />wchar_t pwstr2[</span><span style="color: rgb(0, 0, 0);">20</span><span style="color: rgb(0, 0, 0);">];<br /><br />    </span><span style="color: rgb(0, 0, 255);">char</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">pcstr </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> (</span><span style="color: rgb(0, 0, 255);">char</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">)malloc(</span><span style="color: rgb(0, 0, 255);">sizeof</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(0, 0, 255);">char</span><span style="color: rgb(0, 0, 0);">)</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);"> wcslen(pwstr)</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">));<br /><br />    memset(pcstr , </span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);"> , </span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);"> wcslen(pwstr)</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);"> );<br /><br />    w2c(pcstr,pwstr,</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);"> wcslen(pwstr)</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">) ;<br /><br />    printf(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">%s\n</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,pcstr);<br /><br />c2w(pwstr2,</span><span style="color: rgb(0, 0, 0);">20</span><span style="color: rgb(0, 0, 0);">,pcstr);<br /><br />wprintf(l</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">%s</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,pwstr2);<br /><br />    free(pcstr) ;<br /><br /></span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;<br /><br />}<br /><br /></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">将wchar_t* 转成char*的实现函数如下：</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 255);">char</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">w2c(</span><span style="color: rgb(0, 0, 255);">char</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">pcstr,</span><span style="color: rgb(0, 0, 255);">const</span><span style="color: rgb(0, 0, 0);"> wchar_t </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">pwstr, size_t len)<br /><br />{<br /><br /></span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> nlength</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">wcslen(pwstr);<br /><br /></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">获取转换后的长度</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> nbytes </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> WideCharToMultiByte( </span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">, </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> specify the code page used to perform the conversion</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">,         </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> no special flags to handle unmapped characters</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);"><br />pwstr,     </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> wide character string to convert</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);"><br />nlength,   </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> the number of wide characters in that string</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);"><br />NULL,      </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> no output buffer given, we just want to know how long it needs to be</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">,<br /><br />NULL,      </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> no replacement character given</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);"><br />NULL );    </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> we don't want to know if a character didn't make it through the translation<br /><br /></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> make sure the buffer is big enough for this, making it larger if necessary</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(nbytes</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">len)   nbytes</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">len;<br /><br /></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> 通过以上得到的结果，转换unicode 字符为ascii 字符</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);"><br />WideCharToMultiByte( </span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">, </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> specify the code page used to perform the conversion</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">,         </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> no special flags to handle unmapped characters</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);"><br />pwstr,   </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> wide character string to convert</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);"><br />nlength,   </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> the number of wide characters in that string</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);"><br />pcstr, </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> put the output ascii characters at the end of the buffer</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);"><br />nbytes,                           </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> there is at least this much space there</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);"><br />NULL,      </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> no replacement character given</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);"><br />NULL );<br /><br /></span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> pcstr ;<br /><br />}<br /><br /></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">将char* 转成wchar_t*的实现函数如下：<br /><br /></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">这是把asii字符转换为unicode字符，和上面相同的原理</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> c2w(wchar_t </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">pwstr,size_t len,</span><span style="color: rgb(0, 0, 255);">const</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">char</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">str)<br /><br />{<br /><br /></span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(str)<br /><br />    {<br /><br />      size_t nu </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> strlen(str);<br /><br />      size_t n </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">(size_t)multibytetowidechar(cp_acp,</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">,(</span><span style="color: rgb(0, 0, 255);">const</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">char</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">)str,(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">)nu,</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">);<br /><br />      </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(n</span><span style="color: rgb(0, 0, 0);">&gt;=</span><span style="color: rgb(0, 0, 0);">len)n</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">len</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">;<br /><br />      multibytetowidechar(cp_acp,</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">,(</span><span style="color: rgb(0, 0, 255);">const</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">char</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">)str,(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">)nu,pwstr,(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">)n);<br /><br />   pwstr[n]</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;<br /><br />    }<br /><br />}<br /><br />或者用此种方法更好一些：</span><span style="color: rgb(0, 0, 0);">============</span><span style="color: rgb(0, 0, 0);">我自已做的<br /><br /></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">把ascii 字符转换为unicode字符</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);"><br />wchar_t</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);"> Cphone_hq::ctow(wchar_t </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">pwstr, </span><span style="color: rgb(0, 0, 255);">const</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">char</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">str)<br /><br />{<br /><br />wchar_t</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);"> buffer;<br /><br /></span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(str)<br /><br />    {<br /><br />      size_t nu </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> strlen(str);<br /><br />      size_t n </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">(size_t)MultiByteToWideChar(CP_ACP,</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">,(</span><span style="color: rgb(0, 0, 255);">const</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">char</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">)str,</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">(nu),NULL,</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">);<br /><br />   buffer</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;<br /><br />      buffer </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> wchar_t[n</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">];<br /><br />      </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">if(n&gt;=len) n=len-1;</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);"><br />   ::MultiByteToWideChar(CP_ACP,</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">,(</span><span style="color: rgb(0, 0, 255);">const</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">char</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">)str,</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">(nu),buffer,</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">(n));    <br /><br />   }<br /><br /></span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> buffer;<br /><br />delete buffer;<br /><br />}</span></div><br /><p style="text-indent: 2em;">相关知识点：</p><p style="text-indent: 2em;">Unicode的出现是为了适应软件国际化的需要。Unicode不同于双字节字符集（DBCS）。</p><p style="text-indent: 2em;">一、相关操作函数</p><p style="text-indent: 2em;">       1、DBCS使用下面的函数操作字符串：</p><p style="text-indent: 2em;">             CharNext——获得后一个字符</p><p style="text-indent: 2em;">            CharPrev——获得前一个字符</p><p style="text-indent: 2em;">            IsDBCSLeadByte——判断是否为两个字节字符的第一个字节</p><p style="text-indent: 2em;">            C++运行期库提供了以"_mbs"开头的一系列的函数操作DBCS。类似的函数有_mbscat等。</p><p style="text-indent: 2em;">       2、ANSI字符集是一个美国标准。C++运行期库提供了以"str"开头的一些列的函数操作此字符集。</p><p style="text-indent: 2em;">       3、C++运行期库为Unicode字符集提供了一系列以"wcs"开头的函数。</p><p style="text-indent: 2em;">二、对应的数据类型</p><p style="text-indent: 2em;">       1、对于ANSI字符定义为char。</p><p style="text-indent: 2em;">        2、对于Unicode的字符定义为wchar_t。</p><p style="text-indent: 2em;">三、使用环境</p><p style="text-indent: 2em;">       1、首先要说明的是Win98对于Unicode的支持是很微弱的，所以如果要在Win98上运行Unicode编译的程序，可能造成运行错误或者失败。</p><p style="text-indent: 2em;">       2、
由于Win2000及以后的OS的内核都是使用Unicode编写的，所以虽然可以在其上运行ANSI编码的程序，但是其运行过程中很多地方都需要将
ANSI转换为Unicode以后，调用Unicode版本的函数，因为这个转换的过程存在所以ANSI的程序运行效率不高。在Win2000上最好使用
Unicode编写程序。</p><p style="text-indent: 2em;">四、编写通用的程序</p><p style="text-indent: 2em;">       1、在编程的时候使用TCHAR数据类型，此类型能够根据预编译宏的定义，将其转换为ANSI或者是Unicode。</p><p style="text-indent: 2em;">       2、预编译宏_MBCS、_UNICODE和UNICODE。_MBCS是多字节和ANSI字符串的编译宏。此时TCHAR将转换为char。_UNICODE和UNICODE是Unicode编码的预编译宏，TCHAR将转换为wchar_t。</p><p style="text-indent: 2em;">       3、_UNICODE和UNICODE与_MBCS不能在编译的时候同时被定义。</p><p style="text-indent: 2em;">       4、_UNICODE宏用于C运行期库的头文件，UNICODE宏用于Windows头文件。一般同时定义这两个宏。</p><p style="text-indent: 2em;">五、转换函数</p><p style="text-indent: 2em;">       1、Unicode转换为ANSI使用：MultiByteToWideChar。</p><p style="text-indent: 2em;">       2、ANSI转换为Unicode使用：WideCharToMultiByte。</p><p style="text-indent: 2em;"></p><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td valign="top"><p style="text-indent: 2em;">宽字符转多字符：</p><p style="text-indent: 2em;">       size_t wcstombs(char *mbstr, const wchar_t *wcstr, size_t count );</p><p style="text-indent: 2em;">多字符转宽字符：</p><p style="text-indent: 2em;">       size_t mbstowcs(wchar_t *wcstr, const char *mbstr, size_t count );</p><p style="text-indent: 2em;">       另：L"ab"是C/C++标准宏，使用上是没有问题的</p></td></tr></tbody></table><p style="text-indent: 2em;">      1、client 里有些函数接口需要unicode，这些由于资源也在本地，可以直接使用MultiByteToWideChar或者mbstowcs+setlocale 转换</p><p style="text-indent: 2em;">      
2、对于需要从
中文client-&gt;服务器-&gt;韩文client的方式下，在传文本的情况下，需要将文字的语言代码一起传出去，在接受端可以使用指定的代
码，转换。服务器如有必要的话，也可以使用该代码转换，这样就可以在client上同时显示多国语言了</p><img src ="http://www.cnitblog.com/textbox/aggbug/64672.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/textbox/" target="_blank">零度</a> 2010-03-16 14:18 <a href="http://www.cnitblog.com/textbox/archive/2010/03/16/64672.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>typdef 函數指針 (轉）</title><link>http://www.cnitblog.com/textbox/archive/2010/03/10/64574.html</link><dc:creator>零度</dc:creator><author>零度</author><pubDate>Wed, 10 Mar 2010 03:23:00 GMT</pubDate><guid>http://www.cnitblog.com/textbox/archive/2010/03/10/64574.html</guid><wfw:comment>http://www.cnitblog.com/textbox/comments/64574.html</wfw:comment><comments>http://www.cnitblog.com/textbox/archive/2010/03/10/64574.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/textbox/comments/commentRss/64574.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/textbox/services/trackbacks/64574.html</trackback:ping><description><![CDATA[函数指针<br />一个函数在编译时被分配一个入口地址，将这个入口地址称为函数的指针，可<br />以用一个指针变量指向该函数指针，然后通过该变量来调用函数。<br />有关说明：<br />　　1、函数指针的声明格式：<br />　　　函数返回值类型（＊指针变量名）（参数类型列表）<br />　　   或者是：<br />　　   typedef　函数返回值类型　（＊指针变量名）（参数类型列表）<br />    2、一个函数指针只能指向一种类型的函数，即具有相同的返回值和相同的参　　　　　　　　　　　　<br />　　　 数的函数<br />　　３、关于函数指针的加减运算没有意义<br />　　 函数指针数组定义：<br />     函数定义：<br />     void fun1(void *p);<br />     void fun2(void *p);<br />     void fun3(void *p);<br />　　 函数指针数组定义：<br />　　 void(*fun[3])(void*);//typedef void(*pfun)(void*);pfun fun[3];<br />　　 指针赋值：<br />     fun[0] = fun1;<br />     fun[1] = fun2;<br />     fun[2] = fun3;<br />     函数调用：<br />　　 fun[0](&amp;a);         //int a;<br />     fun[1](&amp;b);         //int b;<br />     fun[3](&amp;c);         //int c;<br />  声明一个指向成员函数的指针<br />一个指向成员函数的指针包括成员函数的返回类型，带::符号的类名称，函数参数表。虽然这一语法看似复杂，其实它和普通的指针是一样的。指向外部函数的指针可如下声明：<br />void (*pf)(char *, const char *);<br />void strcpy(char * dest, const char * source);<br />pf=strcpy;<br />相应指向类A的成员函数的指针如下表示：<br />void (A::*pmf)(char *, const char *);<br />以上pmf是指向类A的一个成员函数的指针，传递两个变量char *和 const char *，没有返回值。注意星号前面的A::符号，这和前面的声明是一致的。<br />赋值<br /><br />为了给一个指向成员函数的指针赋值，可以采用成员函数名并再其前面加一个&amp;的方式<br />使用typedef<br />你可以使用typedef来隐藏一些指向成员函数的复杂指针。例如，下面的代码定义了一个类A中的成员函数的指针PMA，并传递char *和const char *参数。<br />typedef void(A::*PMA)(char *, const char *);<br />PMA pmf= &amp;A::strcat; // use a typedef to define a pointer to member<br />使用typedef特别有用，尤其是对于指向成员函数的数组指针。<br />■void类型的指针<br />    void含义：<br />    void是“无类型”，void*则为无类型指针，void*可以指向任何类型的数据。<br />    void a；//此变量没有任何实际意义，无法编译通过“illegal use of type”<br />    void 的作用：<br />         1、对程序返回的限定<br />         2、对函数参数的限定<br />    我们知道，如何指针p1和p2的类型相同，那么我们可以直接在p1和p2间赋值，如果不同，必须使用强制类型转换。<br />    如：float *p1;   int *p2;<br />    若：p1 = p2; 编译出错：“can not covert from int* to float*”<br />    必须为：p1 = (float*)p2;<br />                而void*不同，任何类型的指针都可以直接赋为它，不需要强制类型转换：<br />                如：void *p1;   int *p2;<br />                    可作：p1 =p2;<br />                    无类型可以包容有类型，有类型不能包容无类型：<br />                    必须为：p2 = (int*)p1;<br />                viod 和 void*使用规则总结：<br />    ●     如果函数没有返回值，那么应声明为void类型<br />    在C语言中，凡不加返回值类型限定的函数，就会被编译器作为返回整型值处理。但是许多程序员却误以为其为void类型. 林锐博士《高质量C/C++编程》中提到：“C++语言有很严格的类型安全检查，不允许上述情况（指函数不加类型声明）发生”。可是编译器并不一定这么认定，譬如在Visual C++6.0中上述add函数的编译无错也无警告且运行正确，所以不能寄希望于编译器会做严格的类型检查。<br />    因此，为了避免混乱，我们在编写C/C++程序时，对于任何函数都必须一个不漏地指定其类型。如果函数没有返回值，一定要声明为void类型。这既是程序良好可读性的需要，也是编程规范性的要求。另外，加上void类型声明后，也可以发挥代码的“自注释”作用。代码的“自注释”即代码能自己注释自己。<br />    ● 如果函数无参数，那么应声明其参数为void<br />    ● 小心使用void指针类型<br />    按照ANSI的标准，不能对void指针进行算法操作，即下列操作是不合法的：<br />    void *pvoid;<br />    pvoid ++;         //ansi错误<br />    pvoid += 1;        //ansi 错误<br />    ansi标准之所以这样认定，是因为它坚持，进行算法操作的指针必须是确定知道其指向数据类型的大小的。<br />    但GUN（GUN’s Not Unix）则不这么认为，它指定void*的算法操作与char*一致。因此在GUN编译器中上述语句是正确的。<br />    在实际的程序中，为了迎合ansi标准，并提高程序的可移植性，我们可以这样实现同样功能的代码：<br />    void *pvoid;<br />    (char*)pvoid++;<br />    (char*)pvoid += 1;<br />    ● 如果函数的参数可以是任意类型指针，那么应声明其参数为void *<br />    典型的如内存操作函数memcpy和memset的函数原型分别为：<br />    void* memcpy(void *dest, const void *src, size_t len);<br />    void* memset(void *buffer,int c, size_t num);<br />    这样，任何类型的指针都可以传入memcpy和memset中，这也真实地体现了内存操作函数的意义，因为它操作的对象仅仅是一片内存，而不论内存是什类型。<br />    ● void不能代表一个真实的变量<br />    void a; //错误<br />    function(void a); //错误<br />■this指针<br />    《深入浅出MFC》中解释：<br />     定义类CRect，定义两个对象rect1、rect2，各有自己的m_color成员变量，但 rect1.setcolor和rect2.setcolor却都是通往唯一的CRect::setcolor成员函数，那么 CRect::setcolor如何处理不同对象的m_color？答案是由一个隐藏参数，名为this指针。当你调用：<br />    rect1.setcolro(2);<br />    rect2.setcolor(3);<br />    时，编译器实际上为你做出来一下的代码：<br />    CRect::setcolor(2,(CRect*)&amp;rect1);<br />    CRect::setcolor(3,(CRect*)&amp;rect2);<br />    多出来的参数，就是所谓的this指针。<br />    class CRect<br />    {<br /><br />    ……<br /><br />    public:<br /><br />     void setcolor(int color){m_color = color};<br /><br />    };<br /><br />    被编译后，其实为：<br />    class CRect<br />    {<br />    ……<br />    public:<br />     void setcolor(int color,(CRect*)this){this-&gt;m_color = color};<br />    }; <br /><img src ="http://www.cnitblog.com/textbox/aggbug/64574.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/textbox/" target="_blank">零度</a> 2010-03-10 11:23 <a href="http://www.cnitblog.com/textbox/archive/2010/03/10/64574.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>STL (Standard Template Library)标准模板库 C++</title><link>http://www.cnitblog.com/textbox/archive/2010/03/08/64542.html</link><dc:creator>零度</dc:creator><author>零度</author><pubDate>Mon, 08 Mar 2010 07:46:00 GMT</pubDate><guid>http://www.cnitblog.com/textbox/archive/2010/03/08/64542.html</guid><wfw:comment>http://www.cnitblog.com/textbox/comments/64542.html</wfw:comment><comments>http://www.cnitblog.com/textbox/archive/2010/03/08/64542.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/textbox/comments/commentRss/64542.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/textbox/services/trackbacks/64542.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 以下资料均来自网络上的 。     标准模板库（Standard Template Library，STL）是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。现在虽说它主要出现在C++中，但在被引入C++之前该技术就已经存在了很长的一段时间。　　STL的代码从广义上讲分为三类：algor...&nbsp;&nbsp;<a href='http://www.cnitblog.com/textbox/archive/2010/03/08/64542.html'>阅读全文</a><img src ="http://www.cnitblog.com/textbox/aggbug/64542.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/textbox/" target="_blank">零度</a> 2010-03-08 15:46 <a href="http://www.cnitblog.com/textbox/archive/2010/03/08/64542.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c/c++ vc/bc new/malloc()  free()/delete()</title><link>http://www.cnitblog.com/textbox/archive/2010/03/08/64534.html</link><dc:creator>零度</dc:creator><author>零度</author><pubDate>Mon, 08 Mar 2010 03:03:00 GMT</pubDate><guid>http://www.cnitblog.com/textbox/archive/2010/03/08/64534.html</guid><wfw:comment>http://www.cnitblog.com/textbox/comments/64534.html</wfw:comment><comments>http://www.cnitblog.com/textbox/archive/2010/03/08/64534.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/textbox/comments/commentRss/64534.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/textbox/services/trackbacks/64534.html</trackback:ping><description><![CDATA[
		<br />看到上面的关键字有什么感想啊。他们都有相同的功能，区别在那里呢？ (网络上找来的一些）<br /><br />（1）new是操作符，同+、-、*、/有着相同的地位，它是保留字，不用头文件的支持，创建的是一个对象；建立的对象你可以把它当成一个普通的对象,用成员函数访问,不要直接访问它的地址空间；<br />  使用形式：<br />          new返回的是指针(指向new出来的那个对象)。<br />          失败返回异常<br /><br />（2）malloc是个分配内存的函数，需要头文件的支持，分配的是一块内存区域,就用指针访问好了,而且还可以在里面移动指针。<br />       使用形式：<br />          （指针类型）malloc(sizeof())<br />            失败返回NULL指针<br /><br />（3）malloc与free是C++/C语言的标准库函数，new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。<br />（4）对
于非内部数据类型的对象而言，光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数，对象在消亡之前要自动执行析构函
数。由于malloc/free是库函数而不是运算符，不在编译器控制权限之内，不能够把执行构造函数和析构函数的任务强加于malloc/free.<br /><br />（5）因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new，以一个能完成清理与释放内存工作的运算符delete.注重new/delete不是库函数。<br />（6）C++程序经常要调用C函数，而C程序只能用malloc/free治理动态内存<br />          new 是个操作符，和什么"+"，"-"，"="……有一样的地位。<br />          malloc是个分配内存的函数，供你调用的。<br />          new是保留字，不需要头文件支持。<br />          malloc需要头文件库函数支持。<br />          new 建立的是一个对象，<br />          malloc分配的是一块内存。<br />          new建立的对象你可以把它当成一个普通的对象，用成员函数访问，不要直接访问它的地址空间<br />          malloc分配的是一块内存区域，就用指针访问好了，而且还可以在里面移动指针。<br />          简而言之：<br />          new 是一个操作符，可以重载<br />          malloc是一个函数，可以覆盖<br />          new 初始化对象，调用对象的构造函数，对应的delete调用相应的析构函数<br />          malloc仅仅分配内存，free仅仅回收内存。<br /><br /><br />相比 C 中的 malloc 和 free 函数， C++ 中的new 和delete的最大不同就是 delete释放内存时负责调用类的析构函数,new时会调用类的构造 函数<br /><p>对delete</p><p>               class node</p><p>                           {</p><p>                                 public:</p><p>                                               };</p><p>对这个node类，</p><p>node  *p=new node;  创建了一个新的对象，但是没有命名，是用指针指向这个对象，当使用</p><p>delete p;</p><p>时，就会释放这个指针所指向的空间，同时这个指针仍然指向这个空间的地址！</p><p>比如原来p指向0x78900789内存，delete p以后p依旧指向0x78900789，但这块地址已经没用了， 如果再次被程序引用会出问题。所以必须要p=0<br />但这样写不是最好的，最好是写成p=NULL; </p><br /><img src ="http://www.cnitblog.com/textbox/aggbug/64534.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/textbox/" target="_blank">零度</a> 2010-03-08 11:03 <a href="http://www.cnitblog.com/textbox/archive/2010/03/08/64534.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>