﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-&amp;豪-文章分类-Basic C++</title><link>http://www.cppblog.com/qywyh/category/675.html</link><description>豪-&gt;blog</description><language>zh-cn</language><lastBuildDate>Mon, 19 May 2008 17:54:29 GMT</lastBuildDate><pubDate>Mon, 19 May 2008 17:54:29 GMT</pubDate><ttl>60</ttl><item><title>在多文件中编写使用template函数</title><link>http://www.cppblog.com/qywyh/articles/9608.html</link><dc:creator>豪</dc:creator><author>豪</author><pubDate>Sun, 09 Jul 2006 08:38:00 GMT</pubDate><guid>http://www.cppblog.com/qywyh/articles/9608.html</guid><wfw:comment>http://www.cppblog.com/qywyh/comments/9608.html</wfw:comment><comments>http://www.cppblog.com/qywyh/articles/9608.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qywyh/comments/commentRss/9608.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qywyh/services/trackbacks/9608.html</trackback:ping><description><![CDATA[
		<br />// mytemplate.h 文件<br /><br />#ifndef _MYTEMPLATE_H_<br />#define _MYTEMPLATE_H_<br /><br />template&lt;typename _T&gt;<br />class mytemplate{<br />    T val;<br />public:<br />    void display();<br />}<br />#include "mytemplate.cpp"<br />#endif<br /><br />// 文件 mytemplate.cpp<br /><br />#ifdef _MYTEMPLATE_H_<br />template&lt;typename T&gt;<br />void mytemplate&lt;T&gt;::display(){<br />     cout&lt;&lt;val&lt;&lt;endl;<br />}<br />#endif<br /><br /><br />这样做的好处是我只需改变一个地方就可以使模板有不同的实现，避免了<br />把不同的实现放在同一个文件里时难以避免的预编译标记(那些预编译标记<br />常常很难用，因为记住它们都很麻烦),而且文件短小，阅读维护起来更<br />方便(一个例子是你需要比较模板的不同实现的综合性能时,把它的几个实现<br />都写到一个文件里常常会把人搞糊涂).<br />不管怎样做,程序必须在声明模板实例以前就"看见"了模板的实现部分<img src ="http://www.cppblog.com/qywyh/aggbug/9608.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qywyh/" target="_blank">豪</a> 2006-07-09 16:38 <a href="http://www.cppblog.com/qywyh/articles/9608.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>map 用法</title><link>http://www.cppblog.com/qywyh/articles/3715.html</link><dc:creator>豪</dc:creator><author>豪</author><pubDate>Sat, 04 Mar 2006 06:45:00 GMT</pubDate><guid>http://www.cppblog.com/qywyh/articles/3715.html</guid><wfw:comment>http://www.cppblog.com/qywyh/comments/3715.html</wfw:comment><comments>http://www.cppblog.com/qywyh/articles/3715.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qywyh/comments/commentRss/3715.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qywyh/services/trackbacks/3715.html</trackback:ping><description><![CDATA[<P>#include&lt;iostream&gt;<BR>#include&lt;map&gt;<BR>#include&lt;string&gt;<BR>#include&lt;iterator&gt;<BR>using &nbsp; namespace &nbsp; std;<BR>typedef &nbsp; map&lt;string,string&gt;maps;<BR>typedef &nbsp; pair&lt;string,string&gt;pr;<BR>int &nbsp; main()<BR>{<BR>maps &nbsp; temp;<BR>temp.insert(pr("aa","aaaaa"));<BR>temp.insert(pr("bb","bbbbbb"));<BR>temp.insert(pr("cc","cccc"));<BR>maps &nbsp; tent;<BR>maps::iterator &nbsp; it;<BR>for(it=temp.begin();it!=temp.end();++it)tent.insert(*it);<BR>for(it=tent.begin();it!=tent.end();++it)<BR>{<BR>cout&lt;&lt;(*it).first&lt;&lt;" &nbsp; "&lt;&lt;(*it).second&lt;&lt;endl;<BR>}<BR>return &nbsp; 0;<BR>}<BR></P><img src ="http://www.cppblog.com/qywyh/aggbug/3715.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qywyh/" target="_blank">豪</a> 2006-03-04 14:45 <a href="http://www.cppblog.com/qywyh/articles/3715.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>搜索函数</title><link>http://www.cppblog.com/qywyh/articles/3714.html</link><dc:creator>豪</dc:creator><author>豪</author><pubDate>Sat, 04 Mar 2006 06:26:00 GMT</pubDate><guid>http://www.cppblog.com/qywyh/articles/3714.html</guid><wfw:comment>http://www.cppblog.com/qywyh/comments/3714.html</wfw:comment><comments>http://www.cppblog.com/qywyh/articles/3714.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qywyh/comments/commentRss/3714.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qywyh/services/trackbacks/3714.html</trackback:ping><description><![CDATA[<TABLE width="100%">
<TBODY>
<TR>
<TD vAlign=top width=80>　 
<DIV align=right><BR><FONT face=宋体 size=2><A name=linuxc125></A></FONT></DIV></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2><BR></FONT></DIV></TD>
<TD><FONT face=宋体 size=2><BR>crypt（将密码或数据编码） </FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>相关函数 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2>getpass<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>表头文件 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2>#define _XOPEN_SOURCE<BR>#include&lt;unistd.h&gt;<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>定义函数 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2>char * crypt (const char *key,const char * salt);<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>函数说明 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2>crypt()将使用Data Encryption Standard(DES)演算法将参数key所指的字符串加以编码，key字符串长度仅取前8个字符，超过此长度的字符没有意义。参数salt为两个字符组成的字符串，由a-z、A-Z、0-9，“.”和“/”所组成，用来决定使用4096 种不同内建表格的哪一个。函数执行成功后会返回指向编码过的字符串指针，参数key 所指的字符串不会有所更动。编码过的字符串长度为13 个字符，前两个字符为参数salt代表的字符串。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>返回值 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2>返回一个指向以NULL结尾的密码字符串。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>附加说明 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2>使用GCC编译时需加-lcrypt。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>范例 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2>#include&lt;unistd.h&gt;<BR>main()<BR>{<BR>char passwd[13];<BR>char *key;<BR>char slat[2];<BR>key= getpass(“Input First Password:”);<BR>slat[0]=key[0];<BR>slat[1]=key[1];<BR>strcpy(passwd,crypt(key slat));<BR>key=getpass(“Input Second Password:”);<BR>slat[0]=passwd[0];<BR>slat[1]=passwd[1];<BR>printf(“After crypt(),1st passwd :%s\n”,passwd);<BR>printf(“After crypt(),2nd passwd:%s \n”,crypt(key slat));<BR>}<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>执行 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2>Input First Password: /* 输入test，编码后存于passwd[ ] */<BR>Input Second Password /*输入test，密码相同编码后也会相同*/<BR>After crypt () 1st Passwd : teH0wLIpW0gyQ<BR>After crypt () 2nd Passwd : teH0wLIpW0gyQ<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>　 
<DIV align=right><BR><FONT face=宋体 size=2><A name=linuxc126></A></FONT></DIV></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2><BR></FONT></DIV></TD>
<TD><FONT face=宋体 size=2><BR>bsearch（二元搜索） </FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>相关函数 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2>qsort<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>表头文件 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2>#include&lt;stdlib.h&gt;<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>定义函数 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2>void *bsearch(const void *key,const void *base,size_t nmemb,size_tsize,int (*compar) (const void*,const void*));<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>函数说明 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2>bsearch()利用二元搜索从排序好的数组中查找数据。参数key指向欲查找的关键数据，参数base指向要被搜索的数组开头地址，参数nmemb 代表数组中的元素数量，每一元素的大小则由参数size决定，最后一项参数compar 为一函数指针，这个函数用来判断两个元素之间的大小关系，若传给compar 的第一个参数所指的元素数据大于第二个参数所指的元素数据则必须回传大于0 的值，两个元素数据相等则回传0。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>附加说明 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2>找到关键数据则返回找到的地址，如果在数组中找不到关键数据则返回NULL。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>范例 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2>#include&lt;stdio.h&gt;<BR>#include&lt;stdlib.h&gt;<BR>#define NMEMB 5<BR>#define SIZE 10<BR>int compar(const void *a,const void *b)<BR>{<BR>return (strcmp((char *)a,(char *)b));<BR>}<BR>main()<BR>{<BR>char data[50][size]={“linux”,”freebsd”,”solaris”,”sunos”,”windows”};<BR>char key[80],*base ,*offset;<BR>int i, nmemb=NMEMB,size=SIZE;<BR>while(1){<BR>printf(“&gt;”);<BR>fgets(key,sizeof(key),stdin);<BR>key[strlen(key)-1]=’\0’;<BR>if(!strcmp(key,”exit”))break;<BR>if(!strcmp(key,”list”)){<BR>for(i=0;i&lt;nmemb;i++)<BR>printf(“%s\n”,data[i]);<BR>continue;<BR>}<BR>base = data[0];<BR>qsort(base,nmemb,size,compar);<BR>offset = (char *) bsearch(key,base,nmemb,size,compar);<BR>if( offset = =NULL){<BR>printf(“%s not found!\n”,key);<BR>strcpy(data[nmemb++],key);<BR>printf(“Add %s to data array\n”,key);<BR>}else{<BR>printf(“found: %s \n”,offset);<BR>}<BR>}<BR>}<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>执行 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2>&gt;hello /*输入hello字符串*/<BR>hello not found! /*找不到hello 字符串*/<BR>add hello to data array /*将hello字符串加入*/<BR>&gt;.list /*列出所有数据*/<BR>freebsd<BR>linux<BR>solaris<BR>sunos<BR>windows<BR>hello<BR>&gt;hello<BR>found: hello<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>　 
<DIV align=right><BR><FONT face=宋体 size=2><A name=linuxc127></A></FONT></DIV></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2><BR></FONT></DIV></TD>
<TD><FONT face=宋体 size=2><BR>lfind（线性搜索） </FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>相关函数 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2>lsearch<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>表头文件 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2>#include&lt;stdlib.h&gt;<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>定义函数 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2>void *lfind (const void *key,const void *base,size_t *nmemb,size_t<BR>size,int(* compar) (const void * ,const void *));<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>函数说明 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2>lfind()利用线性搜索在数组中从头至尾一项项查找数据。参数key指向欲查找的关键数据，参数base指向要被搜索的数组开头地址，参数nmemb代表数组中的元素数量，每一元素的大小则由参数size决定，最后一项参数compar为一函数指针，这个函数用来判断两个元素是否相同，若传给compar 的异地个参数所指的元素数据和第二个参数所指的元素数据相同时则返回0，两个元素数据不相同则返回非0值。Lfind()与lsearch()不同点在于，当找不到关键数据时lfind()仅会返回NULL，而不会主动把该笔数据加入数组尾端。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>返回值 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2>找到关键数据则返回找到的该笔元素的地址，如果在数组中找不到关键数据则返回空指针(NULL)。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>范例 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2>参考lsearch()。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>　 
<DIV align=right><BR><FONT face=宋体 size=2><A name=linuxc128></A></FONT></DIV></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2><BR></FONT></DIV></TD>
<TD><FONT face=宋体 size=2><BR>lsearch（线性搜索） </FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>相关函数 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2>lfind<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>表头文件 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2>#include&lt;stdlib.h&gt;<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>定义函数 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2>void *lsearch(const void * key ,const void * base ,size_t * nmemb,size_t size, int ( * compar) (const void * ,const void *));<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>函数说明 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2>lsearch()利用线性搜索在数组中从头至尾一项项查找数据。参数key指向欲查找的关键数据，参数base指向要被搜索的数组开头地址，参数nmemb 代表数组中的元素数量，每一元素的大小则由参数size 决定，最后一项参数compar 为一函数指针，这个函数用来判断两个元素是否相同，若传给compar 的第一个参数所指的元素数据和第二个参数所指的元素数据相同时则返回0，两个元素数据不相同则返回非0 值。如果lsearch（）找不到关键数据时会主动把该项数据加入数组里。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>返回值 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2>找到关键数据则返回找到的该笔元素的四肢，如果在数组中找不到关键数据则将此关键数据加入数组，再把加入数组后的地址返回。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>范例 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2>#include&lt;stdio.h&gt;<BR>#include&lt;stdlib.h&gt;<BR>#define NMEMB 50<BR>#define SIZE 10<BR>int compar (comst void *a,const void *b)<BR>{<BR>return (strcmp((char *) a, (char *) b));<BR>}<BR>main()<BR>{<BR>char data[NMEMB][SIZE]={“Linux”,”freebsd”,”solzris”,”sunos”,”windows”};<BR>char key[80],*base,*offset;<BR>int i, nmemb=NMEMB,size=SIZE;<BR>for(i=1;i&lt;5;i++){<BR>fgets(key,sizeof9key),stdin);<BR>key[strlen(key)-1]=’\0’;<BR>base = data[0];<BR>offset = (char *)lfind(key,base,&amp;nmemb,size,compar);<BR>if(offset ==NULL){<BR>printf(“%s not found!\n”,key);<BR>offset=(char *) lsearch(key,base,&amp;nmemb,size,compar);<BR>printf(“Add %s to data array\n”,offset);<BR>}else{<BR>printf(“found : %s \n”,offset);<BR>}<BR>}<BR>}<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>执行 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2>linux<BR>found:linux<BR>os/2<BR>os/2 not found!<BR>add os/2 to data array<BR>os/2<BR>found:os/2<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>　 
<DIV align=right><BR><FONT face=宋体 size=2><A name=linuxc129></A></FONT></DIV></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2><BR></FONT></DIV></TD>
<TD><FONT face=宋体 size=2><BR>qsort（利用快速排序法排列数组） </FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>相关函数 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2>bsearch<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>表头文件 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2>#include&lt;stdlib.h&gt;<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>定义函数 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2>void qsort(void * base,size_t nmemb,size_t size,int ( * compar)(const void *, const void *));<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>函数说明 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2>参数base指向欲排序的数组开头地址，参数nmemb代表数组中的元素数量，每一元素的大小则由参数size决定，最后一项参数compar为一函数指针，这个函数用来判断两个元素间的大小关系，若传给compar的第一个参数所指的元素数据大于第二个参数所指的元素数据则必须回传大于零的值，两个元素数据相等则回传0。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>返回值 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2><BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>附加说明 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2><BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>范例 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2>#define nmemb 7<BR>#include &lt;stdlib.h&gt;<BR>int compar (const void *a ,const void *b)<BR>{<BR>int *aa=(int * ) a,*bb = (int * )b;<BR>if( * aa &gt;* bb)return 1;<BR>if( * aa == * bb) return 0;<BR>if( * aa &lt; *bb) return -1;<BR>}<BR>main( )<BR>{<BR>int base[nmemb]={ 3,102,5,-2,98,52,18};<BR>int i;<BR>for ( i=0; i&lt;nmemb;i++)<BR>printf(“%d “,base[i]);<BR>printf(“\n”);<BR>qsort(base,nmemb,sizeof(int),compar);<BR>for(i=0;i&lt;nmemb;i++)<BR>printf(“%d”base[i]);<BR>printf(“\n”);<BR>}<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>执行 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2>3 102 5 -2 98 52 18<BR>-2 3 5 18 52 98 102<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>　 
<DIV align=right><BR><FONT face=宋体 size=2><A name=linuxc130></A></FONT></DIV></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2><BR></FONT></DIV></TD>
<TD><FONT face=宋体 size=2><BR>rand（产生随机数） </FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>相关函数 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2>srand，random，srandom<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>表头文件 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2>#include&lt;stdlib.h&gt;<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>定义函数 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2>int rand(void)<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>函数说明 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2>rand()会返回一随机数值，范围在0至RAND_MAX 间。在调用此函数产生随机数前，必须先利用srand()设好随机数种子，如果未设随机数种子，rand()在调用时会自动设随机数种子为1。关于随机数种子请参考srand()。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>返回值 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2>返回0至RAND_MAX之间的随机数值，RAND_MAX定义在stdlib.h，其值为2147483647。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>范例 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2>/* 产生介于1 到10 间的随机数值，此范例未设随机数种子，完整的随机数产生请参考<BR>srand（）*/<BR>#include&lt;stdlib.h&gt;<BR>main()<BR>{<BR>int i,j;<BR>for(i=0;i&lt;10;i++)<BR>{<BR>j=1+(int)(10.0*rand()/(RAND_MAX+1.0));<BR>printf(“%d “,j);<BR>}<BR>}<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>执行 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2>9 4 8 8 10 2 4 8 3 6<BR>9 4 8 8 10 2 4 8 3 6<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>　 
<DIV align=right><BR><FONT face=宋体 size=2><A name=linuxc131></A></FONT></DIV></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2><BR></FONT></DIV></TD>
<TD><FONT face=宋体 size=2><BR>srand（设置随机数种子） </FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>相关函数 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2>rand，random srandom<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>表头文件 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2>#include&lt;stdlib.h&gt;<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>定义函数 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2>void srand (unsigned int seed);<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>函数说明 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2>srand()用来设置rand()产生随机数时的随机数种子。参数seed必须是个整数，通常可以利用geypid()或time(0)的返回值来当做seed。如果每次seed都设相同值，rand()所产生的随机数值每次就会一样。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>返回值 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2><BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>范例 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2>/* 产生介于1 到10 间的随机数值，此范例与执行结果可与rand（）参照*/<BR>#include&lt;time.h&gt;<BR>#include&lt;stdlib.h&gt;<BR>main()<BR>{<BR>int i,j;<BR>srand((int)time(0));<BR>for(i=0;i&lt;10;i++)<BR>{<BR>j=1+(int)(10.0*rand()/(RAND_MAX+1.0));<BR>printf(“ %d “,j);<BR>}<BR>}<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>执行 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2>5 8 8 8 10 2 10 8 9 9<BR>2 9 7 4 10 3 2 10 8 7<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>　 
<DIV align=right><BR></DIV></TD></TR></TBODY></TABLE><img src ="http://www.cppblog.com/qywyh/aggbug/3714.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qywyh/" target="_blank">豪</a> 2006-03-04 14:26 <a href="http://www.cppblog.com/qywyh/articles/3714.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>qsort函数应用大全(转)</title><link>http://www.cppblog.com/qywyh/articles/3405.html</link><dc:creator>豪</dc:creator><author>豪</author><pubDate>Wed, 22 Feb 2006 05:45:00 GMT</pubDate><guid>http://www.cppblog.com/qywyh/articles/3405.html</guid><wfw:comment>http://www.cppblog.com/qywyh/comments/3405.html</wfw:comment><comments>http://www.cppblog.com/qywyh/articles/3405.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/qywyh/comments/commentRss/3405.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qywyh/services/trackbacks/3405.html</trackback:ping><description><![CDATA[七种qsort排序方法 <BR><BR>&lt;本文中排序都是采用的从小到大排序&gt; <BR><BR>一、对int类型数组排序 <BR><BR>int num[100]; <BR><BR>Sample: <BR><BR>int cmp ( const void *a , const void *b ) <BR>{ <BR>return *(int *)a - *(int *)b; <BR>} <BR><BR>qsort(num,100,sizeof(num[0]),cmp); <BR><BR>二、对char类型数组排序（同int类型） <BR><BR>char word[100]; <BR><BR>Sample: <BR><BR>int cmp( const void *a , const void *b ) <BR>{ <BR>return *(char *)a - *(int *)b; <BR>} <BR><BR>qsort(word,100,sizeof(word[0]),cmp); <BR><BR>三、对double类型数组排序（特别要注意） <BR><BR>double in[100]; <BR><BR>int cmp( const void *a , const void *b ) <BR>{ <BR>return *(double *)a &gt; *(double *)b ? 1 : -1; <BR>} <BR><BR>qsort(in,100,sizeof(in[0]),cmp)； <BR><BR>四、对结构体一级排序 <BR><BR>struct In <BR>{ <BR>double data; <BR>int other; <BR>}s[100] <BR><BR>//按照data的值从小到大将结构体排序,关于结构体内的排序关键数据data的类型可以很多种，参考上面的例子写 <BR><BR>int cmp( const void *a ,const void *b) <BR>{ <BR>return (*(In *)a)-&gt;data &gt; (*(In *)b)-&gt;data ? 1 : -1; <BR>} <BR><BR>qsort(s,100,sizeof(s[0]),cmp); <BR><BR>五、对结构体二级排序 <BR><BR>struct In <BR>{ <BR>int x; <BR>int y; <BR>}s[100]; <BR><BR>//按照x从小到大排序，当x相等时按照y从大到小排序 <BR><BR>int cmp( const void *a , const void *b ) <BR>{ <BR>struct In *c = (In *)a; <BR>struct In *d = (In *)b; <BR>if(c-&gt;x != d-&gt;x) return c-&gt;x - d-&gt;x; <BR>else return d-&gt;y - c-&gt;y; <BR>} <BR><BR>qsort(s,100,sizeof(s[0]),cmp); <BR><BR>六、对字符串进行排序 <BR><BR>struct In <BR>{ <BR>int data; <BR>char str[100]; <BR>}s[100]; <BR><BR>//按照结构体中字符串str的字典顺序排序 <BR><BR>int cmp ( const void *a , const void *b ) <BR>{ <BR>return strcmp( (*(In *)a)-&gt;str , (*(In *)b)-&gt;str ); <BR>} <BR><BR>qsort(s,100,sizeof(s[0]),cmp); <BR><BR>七、计算几何中求凸包的cmp <BR><BR>int cmp(const void *a,const void *b) //重点cmp函数，把除了1点外的所有点，旋转角度排序 <BR>{ <BR>struct point *c=(point *)a; <BR>struct point *d=(point *)b; <BR>if( calc(*c,*d,p[1]) &lt; 0) return 1; <BR>else if( !calc(*c,*d,p[1]) &amp;&amp; dis(c-&gt;x,c-&gt;y,p[1].x,p[1].y) &lt; dis(d-&gt;x,d-&gt;y,p[1].x,p[1].y)) //如果在一条直线上，则把远的放在前面 <BR>return 1; <BR>else return -1; <BR>} <BR><BR>PS: <BR><BR>其中的qsort函数包含在&lt;stdlib.h&gt;的头文件里，strcmp包含在&lt;string.h&gt;的头文件里<img src ="http://www.cppblog.com/qywyh/aggbug/3405.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qywyh/" target="_blank">豪</a> 2006-02-22 13:45 <a href="http://www.cppblog.com/qywyh/articles/3405.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>字符串与数之间转换函数</title><link>http://www.cppblog.com/qywyh/articles/3404.html</link><dc:creator>豪</dc:creator><author>豪</author><pubDate>Wed, 22 Feb 2006 05:44:00 GMT</pubDate><guid>http://www.cppblog.com/qywyh/articles/3404.html</guid><wfw:comment>http://www.cppblog.com/qywyh/comments/3404.html</wfw:comment><comments>http://www.cppblog.com/qywyh/articles/3404.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qywyh/comments/commentRss/3404.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qywyh/services/trackbacks/3404.html</trackback:ping><description><![CDATA[<TABLE width="100%">
<TBODY>
<TR>
<TD vAlign=top width=80>　 
<DIV align=right><BR><FONT face=宋体 size=2><A name=linuxc14></A></FONT></DIV></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2><BR></FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2><BR>atof（将字符串转换成浮点型数） </FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>相关函数 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>atoi，atol，strtod，strtol，strtoul<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>表头文件 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>#include &lt;stdlib.h&gt;<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>定义函数 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>double atof(const char *nptr);<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>函数说明 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>atof()会扫描参数nptr字符串，跳过前面的空格字符，直到遇上数字或正负符号才开始做转换，而再遇到非数字或字符串结束时('\0')才结束转换，并将结果返回。参数nptr字符串可包含正负号、小数点或E(e)来表示指数部分，如123.456或123e-2。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>返回值 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>返回转换后的浮点型数。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>附加说明 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>atof()与使用strtod(nptr,(char**)NULL)结果相同。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>范例 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>/* 将字符串a 与字符串b转换成数字后相加*/<BR>#include&lt;stdlib.h&gt;<BR>main()<BR>{<BR>char *a=”-100.23”;<BR>char *b=”200e-2”;<BR>float c;<BR>c=atof(a)+atof(b);<BR>printf(“c=%.2f\n”,c);<BR>}<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>执行 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>c=-98.23<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>　 
<DIV align=right><BR><FONT face=宋体 size=2><A name=linuxc15></A></FONT></DIV></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2><BR></FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2><BR>atoi（将字符串转换成整型数） </FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>相关函数 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>atof，atol，atrtod，strtol，strtoul<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>表头文件 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>#include&lt;stdlib.h&gt;<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>定义函数 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>int atoi(const char *nptr);<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>函数说明 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>atoi()会扫描参数nptr字符串，跳过前面的空格字符，直到遇上数字或正负符号才开始做转换，而再遇到非数字或字符串结束时('\0')才结束转换，并将结果返回。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>返回值 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>返回转换后的整型数。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>附加说明 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>atoi()与使用strtol(nptr，(char**)NULL，10)；结果相同。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>范例 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>/* 将字符串a 与字符串b转换成数字后相加*/<BR>#include&lt;stdlib.h&gt;<BR>mian()<BR>{<BR>char a[]=”-100”;<BR>char b[]=”456”;<BR>int c;<BR>c=atoi(a)+atoi(b);<BR>printf(c=%d\n”,c);<BR>}<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>执行 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>c=356<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>　 
<DIV align=right><BR><FONT face=宋体 size=2><A name=linuxc16></A></FONT></DIV></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2><BR></FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2><BR>atol（将字符串转换成长整型数） </FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>相关函数 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>atof，atoi，strtod，strtol，strtoul<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>表头文件 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>#include&lt;stdlib.h&gt;<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>定义函数 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>long atol(const char *nptr);<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>函数说明 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>atol()会扫描参数nptr字符串，跳过前面的空格字符，直到遇上数字或正负符号才开始做转换，而再遇到非数字或字符串结束时('\0')才结束转换，并将结果返回。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>返回值 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>返回转换后的长整型数。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>附加说明 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>atol()与使用strtol(nptr,(char**)NULL,10)；结果相同。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>范例 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>/*将字符串a与字符串b转换成数字后相加*/<BR>#include&lt;stdlib.h&gt;<BR>main()<BR>{<BR>char a[]=”1000000000”;<BR>char b[]=” 234567890”;<BR>long c;<BR>c=atol(a)+atol(b);<BR>printf(“c=%d\n”,c);<BR>}<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>执行 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>c=1234567890<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>　 
<DIV align=right><BR><FONT face=宋体 size=2><A name=linuxc17></A></FONT></DIV></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2><BR></FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2><BR>gcvt（将浮点型数转换为字符串，取四舍五入） </FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>相关函数 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>ecvt，fcvt，sprintf<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>表头文件 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>#include&lt;stdlib.h&gt;<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>定义函数 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>char *gcvt(double number，size_t ndigits，char *buf);<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>函数说明 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>gcvt()用来将参数number转换成ASCII码字符串，参数ndigits表示显示的位数。gcvt()与ecvt()和fcvt()不同的地方在于，gcvt()所转换后的字符串包含小数点或正负符号。若转换成功，转换后的字符串会放在参数buf指针所指的空间。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>返回值 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>返回一字符串指针，此地址即为buf指针。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>附加说明 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2><BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>范例 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>#include&lt;stdlib.h&gt;<BR>main()<BR>{<BR>double a=123.45;<BR>double b=-1234.56;<BR>char *ptr;<BR>int decpt,sign;<BR>gcvt(a,5,ptr);<BR>printf(“a value=%s\n”,ptr);<BR>ptr=gcvt(b,6,ptr);<BR>printf(“b value=%s\n”,ptr);<BR>}<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>执行 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>a value=123.45<BR>b value=-1234.56<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>　 
<DIV align=right><BR><FONT face=宋体 size=2><A name=linuxc18></A></FONT></DIV></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2><BR></FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2><BR>strtod（将字符串转换成浮点数） </FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>相关函数 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>atoi，atol，strtod，strtol，strtoul<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>表头文件 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>#include&lt;stdlib.h&gt;<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>定义函数 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>double strtod(const char *nptr,char **endptr);<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>函数说明 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>strtod()会扫描参数nptr字符串，跳过前面的空格字符，直到遇上数字或正负符号才开始做转换，到出现非数字或字符串结束时('\0')才结束转换，并将结果返回。若endptr不为NULL，则会将遇到不合条件而终止的nptr中的字符指针由endptr传回。参数nptr字符串可包含正负号、小数点或E(e)来表示指数部分。如123.456或123e-2。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>返回值 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>返回转换后的浮点型数。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>附加说明 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>参考atof()。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>范例 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>/*将字符串a，b，c 分别采用10，2，16 进制转换成数字*/<BR>#include&lt;stdlib.h&gt;<BR>mian()<BR>{<BR>char a[]=”1000000000”;<BR>char b[]=”1000000000”;<BR>char c[]=”ffff”;<BR>printf(“a=%d\n”,strtod(a,NULL,10));<BR>printf(“b=%d\n”,strtod(b,NULL,2));<BR>printf(“c=%d\n”,strtod(c,NULL,16));<BR>}<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>执行 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>a=1000000000<BR>b=512<BR>c=65535<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>　 
<DIV align=right><BR><FONT face=宋体 size=2><A name=linuxc19></A></FONT></DIV></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2><BR></FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2><BR>strtol（将字符串转换成长整型数） </FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>相关函数 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>atof，atoi，atol，strtod，strtoul<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>表头文件 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>#include&lt;stdlib.h&gt;<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>定义函数 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>long int strtol(const char *nptr,char **endptr,int base);<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>函数说明 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>strtol()会将参数nptr字符串根据参数base来转换成长整型数。参数base范围从2至36，或0。参数base代表采用的进制方式，如base值为10则采用10进制，若base值为16则采用16进制等。当base值为0时则是采用10进制做转换，但遇到如'0x'前置字符则会使用16进制做转换。一开始strtol()会扫描参数nptr字符串，跳过前面的空格字符，直到遇上数字或正负符号才开始做转换，再遇到非数字或字符串结束时('\0')结束转换，并将结果返回。若参数endptr不为NULL，则会将遇到不合条件而终止的nptr中的字符指针由endptr返回。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>返回值 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>返回转换后的长整型数，否则返回ERANGE并将错误代码存入errno中。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>附加说明 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>ERANGE指定的转换字符串超出合法范围。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>范例 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>/* 将字符串a，b，c 分别采用10，2，16进制转换成数字*/<BR>#include&lt;stdlib.h&gt;<BR>main()<BR>{<BR>char a[]=”1000000000”;<BR>char b[]=”1000000000”;<BR>char c[]=”ffff”;<BR>printf(“a=%d\n”,strtol(a,NULL,10));<BR>printf(“b=%d\n”,strtol(b,NULL,2));<BR>printf(“c=%d\n”,strtol(c,NULL,16));<BR>}<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>执行 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>a=1000000000<BR>b=512<BR>c=65535<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>　 
<DIV align=right><BR><FONT face=宋体 size=2><A name=linuxc20></A></FONT></DIV></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2><BR></FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2><BR>strtoul（将字符串转换成无符号长整型数） </FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>相关函数 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>atof，atoi，atol，strtod，strtol<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>表头文件 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>#include&lt;stdlib.h&gt;<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>定义函数 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>unsigned long int strtoul(const char *nptr,char **endptr,int base);<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>函数说明 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>strtoul()会将参数nptr字符串根据参数base来转换成无符号的长整型数。参数base范围从2至36，或0。参数base代表采用的进制方式，如base值为10则采用10进制，若base值为16则采用16进制数等。当base值为0时则是采用10进制做转换，但遇到如'0x'前置字符则会使用16进制做转换。一开始strtoul()会扫描参数nptr字符串，跳过前面的空格字符串，直到遇上数字或正负符号才开始做转换，再遇到非数字或字符串结束时('\0')结束转换，并将结果返回。若参数endptr不为NULL，则会将遇到不合条件而终止的nptr中的字符指针由endptr返回。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>返回值 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>返回转换后的长整型数，否则返回ERANGE并将错误代码存入errno中。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>附加说明 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>ERANGE指定的转换字符串超出合法范围。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>范例 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>参考strtol()<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>　 
<DIV align=right><BR><FONT face=宋体 size=2><A name=linuxc21></A></FONT></DIV></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2><BR></FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2><BR>toascii（将整型数转换成合法的ASCII 码字符） </FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>相关函数 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>isascii，toupper，tolower<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>表头文件 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>#include&lt;ctype.h&gt;<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>定义函数 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>int toascii(int c)<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>函数说明 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>toascii()会将参数c转换成7位的unsigned char值，第八位则会被清除，此字符即会被转成ASCII码字符。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>返回值 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>将转换成功的ASCII码字符值返回。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>范例 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>#include&lt;stdlib.h&gt;<BR>main()<BR>{<BR>int a=217;<BR>char b;<BR>printf(“before toascii () : a value =%d(%c)\n”,a,a);<BR>b=toascii(a);<BR>printf(“after toascii() : a value =%d(%c)\n”,b,b);<BR>}<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>执行 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>before toascii() : a value =217()<BR>after toascii() : a value =89(Y)<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>　 
<DIV align=right><BR><FONT face=宋体 size=2><A name=linuxc22></A></FONT></DIV></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2><BR></FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2><BR>tolower（将大写字母转换成小写字母） </FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>相关函数 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>isalpha，toupper<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>表头文件 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>#include&lt;stdlib.h&gt;<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>定义函数 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>int tolower(int c);<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>函数说明 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>若参数c为大写字母则将该对应的小写字母返回。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>返回值 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>返回转换后的小写字母，若不须转换则将参数c值返回。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>附加说明 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2><BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>范例 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>/* 将s字符串内的大写字母转换成小写字母*/<BR>#include&lt;ctype.h&gt;<BR>main()<BR>{<BR>char s[]=”aBcDeFgH12345;!#$”;<BR>int i;<BR>printf(“before tolower() : %s\n”,s);<BR>for(i=0;I&lt;sizeof(s);i++)<BR>s[i]=tolower(s[i]);<BR>printf(“after tolower() : %s\n”,s);<BR>}<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>执行 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>before tolower() : aBcDeFgH12345;!#$<BR>after tolower() : abcdefgh12345;!#$<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>　 
<DIV align=right><BR><FONT face=宋体 size=2><A name=linuxc23></A></FONT></DIV></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2><BR></FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2><BR>toupper（将小写字母转换成大写字母） </FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>相关函数 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>isalpha，tolower<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>表头文件 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>#include&lt;ctype.h&gt;<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>定义函数 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>int toupper(int c);<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>函数说明 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>若参数c为小写字母则将该对映的大写字母返回。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>返回值 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>返回转换后的大写字母，若不须转换则将参数c值返回。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>附加说明 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2><BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>范例 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>/* 将s字符串内的小写字母转换成大写字母*/<BR>#include&lt;ctype.h&gt;<BR>main()<BR>{<BR>char s[]=”aBcDeFgH12345;!#$”;<BR>int i;<BR>printf(“before toupper() : %s\n”,s);<BR>for(i=0;I&lt;sizeof(s);i++)<BR>s[i]=toupper(s[i]);<BR>printf(“after toupper() : %s\n”,s);<BR>}<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>执行 </FONT></DIV></TD>
<TD vAlign=top><FONT face=宋体 size=2>before toupper() : aBcDeFgH12345;!#$<BR>after toupper() : ABCDEFGH12345;!#$<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>　 
<DIV align=right><BR></DIV></TD></TR></TBODY></TABLE><img src ="http://www.cppblog.com/qywyh/aggbug/3404.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qywyh/" target="_blank">豪</a> 2006-02-22 13:44 <a href="http://www.cppblog.com/qywyh/articles/3404.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>I/O流控制</title><link>http://www.cppblog.com/qywyh/articles/3340.html</link><dc:creator>豪</dc:creator><author>豪</author><pubDate>Sun, 19 Feb 2006 15:59:00 GMT</pubDate><guid>http://www.cppblog.com/qywyh/articles/3340.html</guid><wfw:comment>http://www.cppblog.com/qywyh/comments/3340.html</wfw:comment><comments>http://www.cppblog.com/qywyh/articles/3340.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qywyh/comments/commentRss/3340.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qywyh/services/trackbacks/3340.html</trackback:ping><description><![CDATA[<STRONG>I/O流控制：<BR></STRONG>(1)控制浮点数值显示可用<EM>setprecision(n)</EM> 控制输出流显示浮点数的数字个数，默认输出有效值为6位。<BR>&nbsp;&nbsp; <EM>setiosflags(ios::fixed) </EM>用定点方式表示实数<BR>&nbsp;&nbsp; <EM>seiosflags(ios::scientific) </EM>用指数方式表示实数<BR><FONT size=+0>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </FONT>setiosflags(ios::fixed)与seiosflags(ios::scientific)都可以和setprecision(n)合用，其效果分别为：控制小数点右边的数字个数，控制指数表示法的小数位数。<BR>&nbsp;&nbsp; 在用浮点表示的输出中，setprecision(n)表示有效位数。<BR>&nbsp;&nbsp; 在用定点表示的输出中，setprecision(n)表示小数位数。<BR>&nbsp;&nbsp; 在用指数形式输出时，setprecision(n)表示小数位数。<BR>&nbsp;&nbsp; 小数位数截短显示时，进行4舍5入处理。<BR>// 测试环境：Visual Studio.net 2003 C++<EM><BR></EM>#include "stdafx.h"<BR>#include &lt;iomanip&gt;<BR>#using &lt;mscorlib.dll&gt;<BR>using namespace System;<BR>using namespace std;<BR>void _tmain()<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp; double amount=22.0/7;<BR>&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt;amount &lt;&lt;endl;<BR>&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt;setprecision(1) &lt;&lt;amount &lt;&lt;endl<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &lt;&lt;setprecision(2) &lt;&lt;amount &lt;&lt;endl<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &lt;&lt;setprecision(3) &lt;&lt;amount &lt;&lt;endl<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &lt;&lt;setprecision(4) &lt;&lt;amount &lt;&lt;endl;<BR>&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt;setiosflags(ios::fixed);<BR>&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt;setprecision(8) &lt;&lt;amount &lt;&lt;endl;<BR>&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt;setiosflags(ios::scientific) &lt;&lt;amount &lt;&lt;endl;&nbsp; // setiosflags(ios::fixed)定义在setiosflags(ios::scientific)前则指数形式不能被正确的输出。<BR>&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt;setprecision(6);<BR>}<BR><FONT size=+0>&nbsp;<BR></FONT>(2)左右对齐输出可用<EM>setiosflags(ios::left)</EM>和<EM>setiosflags(ios::right)</EM>实现。<BR>#include "stdafx.h"<BR>#include &lt;iomanip&gt;<BR>#using &lt;mscorlib.dll&gt;<BR>using namespace System;<BR>using namespace std;<BR>void _tmain()<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt;setiosflags(ios::right)&nbsp; // 交换setiosflags(ios::right)与setiosflags(ios::left)的位置可以实现先左后右对齐，否则都位右对齐<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;&lt;setw(5) &lt;&lt;1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;&lt;setw(5) &lt;&lt;2<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;&lt;setw(5) &lt;&lt;3 &lt;&lt;endl;<BR>&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt;setiosflags(ios::left)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;&lt;setw(5) &lt;&lt;1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;&lt;setw(5) &lt;&lt;2<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;&lt;setw(5) &lt;&lt;3 &lt;&lt;endl;<BR>}<BR>&nbsp;<BR>(3)设置填充字符可用<EM>setw</EM>和<EM>setfill</EM>实现。<EM>setw</EM>用来确定显示的宽度，<EM>setfill</EM>用来确定一个非空格的特别字符（设置填充的字符）。<BR>(4)强制显示小数点和符号可用<EM>setiosflags(ios::showpoint) </EM>和<EM>setiosflags(ios::showpos) </EM>实现。<img src ="http://www.cppblog.com/qywyh/aggbug/3340.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qywyh/" target="_blank">豪</a> 2006-02-19 23:59 <a href="http://www.cppblog.com/qywyh/articles/3340.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++指针探讨 (二) 函数指针 - -</title><link>http://www.cppblog.com/qywyh/articles/2141.html</link><dc:creator>豪</dc:creator><author>豪</author><pubDate>Mon, 26 Dec 2005 10:15:00 GMT</pubDate><guid>http://www.cppblog.com/qywyh/articles/2141.html</guid><wfw:comment>http://www.cppblog.com/qywyh/comments/2141.html</wfw:comment><comments>http://www.cppblog.com/qywyh/articles/2141.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qywyh/comments/commentRss/2141.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qywyh/services/trackbacks/2141.html</trackback:ping><description><![CDATA[<H2 class=diaryTitle>C++指针探讨 (二) 函数指针 - -</H2>
<P>&nbsp;&nbsp;&nbsp;&nbsp;------转载沐枫's blog&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<P>
<DIV class=pgcontent>
<P>&nbsp;&nbsp;&nbsp; 在C/C++中，数据指针是最直接，也最常用的，因此，理解起来也比较容易。而函数指针，作为运行时动态调用（比如回调函数 CallBack Function）是一种常见的，而且是很好用的手段，不能不好好认识一番。</P>
<P>&nbsp;&nbsp;&nbsp; 接下来，我们就讨论一下函数指针。<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; 2 常规函数指针(难度: 3)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT style="BACKGROUND-COLOR: #ccccff">void(*fp)();</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fp 是一个典型的函数指针，用于指向无参数，无返回值的函数。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void(*fp2)(int);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fp2 也是一个函数指针，用于指向有一个整型参数，无返回值的函数。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当然，有经验人士一般都会建议使用typedef来定义函数指针的类型，如：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; typedef void(* FP)();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FP fp3; // 和上面的fp一样的定义。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 函数指针之所以让初学者畏惧，最主要的原因是它的括号太多了；某些用途的函数指针，往往会让人陷在括号堆中出不来，这里就不举例了，因为不是本文讨论的范围；typedef 方法可以有效的减少括号的数量，以及理清层次，所以受到推荐。本文暂时只考虑简单的函数指针，因此暂不用到typedef。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 假如有如下两个函数：<BR>&nbsp; void f1()<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; "call f " &lt;&lt; std::endl;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;void f2(int a)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; "call f2( " &lt;&lt; a &lt;&lt; " )" &lt;&lt; std::endl;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;现在需要通过函数指针来调用，我们需要给指针指定函数：<BR>&nbsp;&nbsp;fp = &amp;f1;&nbsp;// 也可以用：fp = f1;<BR>&nbsp;&nbsp;fp2= &amp;f2;&nbsp;// 也可以用：fp2= f2;<BR>&nbsp;&nbsp;void (*fp3)() = &amp;f1;&nbsp;// 也可以用：void (*fp3)() = f1;&nbsp;&nbsp;<BR>&nbsp;&nbsp;调用时如下：<BR>&nbsp;&nbsp;fp();&nbsp;// 或 (*fp)();<BR>&nbsp;&nbsp;fp2(1); // 或 (*fp2)(1);<BR>&nbsp;&nbsp;fp3();&nbsp; // 或 (*fp3)();<BR>&nbsp;&nbsp;对于此两种调用方法，效果完全一样，我推荐用前一种。后一种不仅仅是多打了键盘，而且也损失了一些灵活性。这里暂且不说它。<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;C++强调类型安全。也就是说，不同类型的变量是不能直接赋值的，否则轻则警告，重则报错。这是一个很有用的特性，常常能帮我们找到问题。因此，有识之士认为，C++中的任何一外警告都不能忽视。甚至有人提出，编译的时候不能出现任何警告信息，也就是说，警告应该当作错误一样处理。<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;比如，我们把f1赋值给fp2，那么C++编译器(vc7.1)就会报错：<BR>&nbsp;&nbsp;fp2 = &amp;f1; // error C2440: “=” : 无法从“void (__cdecl *)(void)”转换为“void (__cdecl *)(int)”<BR>&nbsp;&nbsp;fp1 = &amp;f1; // OK<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;这样，编译器可以帮我们找出编码上的错误，节省了我们的排错时间。C++编译器正致力于这一点。<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;考虑一下C++标准模板库的sort函数：<BR>&nbsp;&nbsp;// 快速排序函数<BR>&nbsp;&nbsp;template<CLASS class="" pr="" randomaccessiterator,="" /><BR>&nbsp;&nbsp;&nbsp;&nbsp; void sort(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RandomAccessIterator _First, // 需排序数据的第一个元素位置<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RandomAccessIterator _Last,&nbsp; // 需排序数据的最后一个元素位置（不参与排序）<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BinaryPredicate _Comp&nbsp;&nbsp;&nbsp;&nbsp; // 排序使用的比较算法(可以是函数指针、函数对象等)<BR>&nbsp;&nbsp;&nbsp;&nbsp; );</P>
<P>&nbsp;&nbsp;比如，我们有一个整型数组：<BR>&nbsp;&nbsp;int n[5] = {3,2,1,8,9};<BR>&nbsp;&nbsp;要对它进行升序排序，我们需定义一个比较函数：<BR>&nbsp;&nbsp;bool less(int a, int b)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return a &lt; b; //&nbsp;感谢网友指出笔误之处。原为 return a-b 是错误的。<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;然后用：<BR>&nbsp;&nbsp;sort(n, n+5, less);<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;要是想对它进行降序排序，我们只要换一个比较函数就可以了：<BR>&nbsp;&nbsp;bool great(int a, int b)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;return b&nbsp;&lt; a; //&nbsp;感谢网友指出笔误之处。原为 return&nbsp;b-a 是错误的。<BR><BR>&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;sort(n, n+5, great);<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;这样，不需要改变sort函数的定义，就可以按任意方法进行排序，是不是很灵活？&nbsp;&nbsp;<BR>&nbsp;&nbsp;这种用法以C++的标准模板库(STL)中非常流行。另外，操作系统中也经常使用回调(CallBack)函数，实际上，所谓回调函数，本质就是函数指针。</P>
<P>（附注）<BR>本文中为了说明函数指针，使用了less和great这两个函数。在C/C++的标准模板库中已经有相应的函数可以直接使用，不需要自已定义。<BR></P></DIV><img src ="http://www.cppblog.com/qywyh/aggbug/2141.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qywyh/" target="_blank">豪</a> 2005-12-26 18:15 <a href="http://www.cppblog.com/qywyh/articles/2141.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++指针探讨 (-) 数据指针</title><link>http://www.cppblog.com/qywyh/articles/2140.html</link><dc:creator>豪</dc:creator><author>豪</author><pubDate>Mon, 26 Dec 2005 10:12:00 GMT</pubDate><guid>http://www.cppblog.com/qywyh/articles/2140.html</guid><wfw:comment>http://www.cppblog.com/qywyh/comments/2140.html</wfw:comment><comments>http://www.cppblog.com/qywyh/articles/2140.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qywyh/comments/commentRss/2140.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qywyh/services/trackbacks/2140.html</trackback:ping><description><![CDATA[<H2 class=diaryTitle>C++指针探讨 (-) 数据指针- -</H2>
<P>&nbsp;&nbsp;&nbsp;------转载沐枫's blog&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<P>&nbsp;&nbsp;&nbsp; 指针，在C/C++语言中一直是很受宠的；几乎找不到一个不使用指针的C/C++应用。用于存储数据和程序的地址，这是指针的基本功能。用于指向整型数，用整数指针(int*)；指向浮点数用浮点数指针(float*)；指向结构，用对应的结构指针(struct xxx *)；指向任意地址，用无类型指针(void*)。<BR>&nbsp;&nbsp;&nbsp; 有时候，我们需要一些通用的指针。在C语言当中，(void*) 可以代表一切；但是在C++中，我们还有一些比较特殊的指针，无法用(void*)来表示。事实上，在C++中，想找到一个通用的指针，特别是通用的函数指针可是一个“不可能任务”。<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; C++是一种强类型的语言，C++的编译器的功能是强大的，它的其中一个设计目标，是尽力为程序找出程序中可能存在的问题；因此，C++对类型的匹配是非常严格的。在C语言中，你可以用void*来指向一切；但在C++中，void*并不能指向一切，就算能，也没有意义，因为它不能帮你发现问题，比如，用函数指针赋值给一个数据指针。<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; 下面我们来探讨一下，C++中如何存储各种类型的指针。<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; 1.&nbsp; 数据指针<BR>&nbsp;&nbsp;&nbsp; &nbsp;数据指针分为两种：常规数据指针和成员数据指针<BR>&nbsp;&nbsp;&nbsp; &nbsp;<BR>&nbsp;&nbsp;&nbsp; 1.1 常规数据指针 (难度: 1)<BR>&nbsp;&nbsp;&nbsp; &nbsp;这个不用说明了，和C语言一样，很简单，直接定义、赋值就够了。常见的有：int*, double* 等等。<BR>&nbsp;&nbsp;&nbsp; &nbsp;如：<BR>&nbsp;&nbsp;&nbsp; &nbsp;int value = 123;<BR>&nbsp;&nbsp;&nbsp; &nbsp;int * pn = &amp;value;<BR>&nbsp;&nbsp;&nbsp; &nbsp;<BR>&nbsp;&nbsp;&nbsp; &nbsp;<BR>&nbsp;&nbsp;&nbsp; 1.2 成员数据指针 (难度: 4)<BR>&nbsp;&nbsp;&nbsp; &nbsp;有如下的结构：<BR>&nbsp;&nbsp;&nbsp; &nbsp;struct MyStruct<BR>&nbsp;&nbsp;&nbsp; &nbsp;{<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; int key;<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; int value;<BR>&nbsp;&nbsp;&nbsp; &nbsp;};<BR>&nbsp;&nbsp;&nbsp; &nbsp;<BR>&nbsp;&nbsp;&nbsp; &nbsp;现在有一个结构对象:<BR>&nbsp;&nbsp;&nbsp; &nbsp;MyStruct me;<BR>&nbsp;&nbsp;&nbsp; &nbsp;<BR>&nbsp;&nbsp;&nbsp; &nbsp;我们需要 value 成员的地址，我们可以：<BR>&nbsp;&nbsp;&nbsp; &nbsp;int * pValue = &amp;me.value;<BR>&nbsp;&nbsp;&nbsp; &nbsp;<BR>&nbsp;&nbsp;&nbsp; &nbsp;:) 没什么难的对吧？<BR>&nbsp;&nbsp;&nbsp; &nbsp;<BR>&nbsp;&nbsp;&nbsp; &nbsp;我们假设一下，现在有一个结构的指针：<BR>&nbsp;&nbsp;&nbsp; &nbsp;<BR>&nbsp;&nbsp;&nbsp; &nbsp;MyStruct* pMe = new MyStruct;<BR>&nbsp;&nbsp;&nbsp; &nbsp;现在，我们要取得 pMe中 value 的指针，要怎么做呢？<BR>&nbsp;&nbsp;&nbsp; &nbsp;int * ppValue = &amp;pMe-&gt;value;<BR>&nbsp;&nbsp;&nbsp; &nbsp;<BR>&nbsp;&nbsp;&nbsp; &nbsp;:) 这仍然很容易。<BR>&nbsp;&nbsp;&nbsp; &nbsp;<BR>&nbsp;&nbsp;&nbsp; &nbsp;当然了，上面讨论的仍然是属于第一种范筹----常规数据指针。<BR>&nbsp;&nbsp;&nbsp; &nbsp;<BR>&nbsp;&nbsp;&nbsp; &nbsp;好了，我们现在需要一种指针，它指向MyStruct中的任一数据成员，那么它应该是这样的子：<BR>&nbsp;&nbsp;&nbsp; &nbsp;int MyStruct::* pMV = &amp;MyStruct::value;<BR>&nbsp;&nbsp;&nbsp; &nbsp;或<BR>&nbsp;&nbsp;&nbsp; &nbsp;int MyStruct::* pMK = &amp;MyStruct::key;<BR>&nbsp;&nbsp;&nbsp; &nbsp;<BR>&nbsp;&nbsp;&nbsp; &nbsp;这种指针的用途是用于取得结构成员在结构内的地址。我们可以通过该指针来访问成员数据：<BR>&nbsp;&nbsp;&nbsp; &nbsp;int value = pMe-&gt;*pMV; // 取得pMe的value成员数据。<BR>&nbsp;&nbsp;&nbsp; &nbsp;int value = me.*pMK; // 取得me的key成员数据。<BR>&nbsp;&nbsp;&nbsp; &nbsp;<BR>&nbsp;&nbsp;&nbsp; &nbsp;也许有人会问了，这种指针有什么用？<BR>&nbsp;&nbsp;&nbsp; &nbsp;确实，成员指针本来就不是一种很常用的指针。不过，在某些时候还是很有用处的。我们先来看看下面的一个函数：<BR>&nbsp;&nbsp;&nbsp; &nbsp;<BR>&nbsp;&nbsp;int sum(MyStruct* objs, int MyStruct::* pm, int count)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int result = 0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i = 0; i &lt; count; ++i)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result += objs[i].*pm;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp; &nbsp;<BR>&nbsp;&nbsp;&nbsp; &nbsp;这个函数的功能是什么，你能看明白吗？它的功能就是，给定count个MyStruct结构的指针，计算出给定成员数据的总和。有点拗口对吧？看看下面的程序，你也许就明白了：<BR>&nbsp;&nbsp;&nbsp; &nbsp;<BR>&nbsp;&nbsp;&nbsp; &nbsp;MyStruct me[10] =<BR>&nbsp;&nbsp;&nbsp; &nbsp;{<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;{1,2},{3,4},{5,6},{7,8},{9,10},{11,12},{13,14},{15,16},{17,18},{19,20}<BR>&nbsp;&nbsp;&nbsp; &nbsp;};<BR>&nbsp;&nbsp;&nbsp; &nbsp;<BR>&nbsp;&nbsp;&nbsp; &nbsp;int sum_value = sum(me, &amp;MyStruct::value, 10);<BR>&nbsp;&nbsp;&nbsp; &nbsp;//计算10个MyStruct结构的value成员的总和： sum_value 值 为 110&nbsp;&nbsp;&nbsp;&nbsp; (2+4+6+8+...+20)<BR>&nbsp;&nbsp;&nbsp; &nbsp;<BR>&nbsp;&nbsp;&nbsp; &nbsp;int sum_key = sum(me, &amp;MyStruct::key, 10);<BR>&nbsp;&nbsp;&nbsp; &nbsp;//计算10个MyStruct结构的key成员的总和：&nbsp;&nbsp; sum_key 值 为 100&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (1+3+5+7+...+19)<BR>&nbsp;&nbsp;&nbsp; &nbsp;<BR>&nbsp;&nbsp;&nbsp; &nbsp;<BR>&nbsp;&nbsp;&nbsp; &nbsp;也许，你觉得用常规指针也可以做到，而且更易懂。Ok，没问题：<BR>&nbsp;&nbsp;&nbsp; &nbsp;int sum_value(MyStruct* objs, int count)<BR>&nbsp;&nbsp;&nbsp; &nbsp;{<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;int result = 0;<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;for(int i = 0; i &lt; count; ++i)<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;result += objs[i].value;<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;return result;<BR>&nbsp;&nbsp;&nbsp; &nbsp;}<BR>&nbsp;&nbsp;&nbsp; &nbsp;你是想这么做吗？但这么做，你只能计算value，如果要算key的话，你要多写一个函数。有多少个成员需要计算的话，你就要写多少个函数，多麻烦啊。<BR></P><img src ="http://www.cppblog.com/qywyh/aggbug/2140.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qywyh/" target="_blank">豪</a> 2005-12-26 18:12 <a href="http://www.cppblog.com/qywyh/articles/2140.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>