??xml version="1.0" encoding="utf-8" standalone="yes"?>怡红院av在线,日本一区二区中文字幕,欧美一级日韩一级http://www.aygfsteel.com/lihao336/category/47963.html成于坚忍Q毁于Qw?/description>zh-cnWed, 14 Dec 2011 00:28:04 GMTWed, 14 Dec 2011 00:28:04 GMT60[转]unix/linux中的dup()pȝ调用http://www.aygfsteel.com/lihao336/archive/2011/12/13/366231.htmlcalvincalvinTue, 13 Dec 2011 06:20:00 GMThttp://www.aygfsteel.com/lihao336/archive/2011/12/13/366231.htmlhttp://www.aygfsteel.com/lihao336/comments/366231.htmlhttp://www.aygfsteel.com/lihao336/archive/2011/12/13/366231.html#Feedback0http://www.aygfsteel.com/lihao336/comments/commentRss/366231.htmlhttp://www.aygfsteel.com/lihao336/services/trackbacks/366231.html    sys_dup()的主要工作就是用来“复制”一个打开的文件号Q两个文g号都指向同一个文件。既然说单,我们首先来看一下它的代码(定义在fs/fcntl.c中)Q?br />
 1 asmlinkage long sys_dup(unsigned int fildes)
 2 {
 3     int ret = -EBADF;
 4     struct file * file = fget(fildes);
 5 
 6     if (file)
 7         ret = dupfd(file, 0);
 8     return ret;
 9 }
10 

而sys_dup()的主体是dupfd()Q定义在同一个文件中Q:

 1 static int dupfd(struct file *file, int start)
 2 {
 3     struct files_struct * files = current->files;
 4     int ret;
 5 
 6     ret = locate_fd(files, file, start);
 7     if (ret < 0)
 8         goto out_putf;
 9     allocate_fd(files, file, ret);
10     return ret;
11 
12 out_putf:
13     write_unlock(&files->file_lock);
14     fput(file);
15     return ret;
16 }
17 

注:dup和dup2的原型如下:
#include <unistd.h>

int dup(int file_descriptor);
int dup2(int file_descriptor1, int file_descriptor2)
dupq回的文件描q符L取最的可用?br />dup2q回的文件描q符或者与file_descriptor2相同Q或者是W一个大于该参数的可用倹{?/font>

    而这么一个简单的pȝ调用是如何完成重定向q个艰巨的Q务的呢?我们不妨先看个例子?br />    当我们在shell下输入如下命令:“echo hello!”,q条命o要求shellq程执行一个可执行文gechoQ参Cؓ“hello!”。当shell接收到命令之后,先找? bin/echoQ然后fork()Z个子q程让他执行bin/echoQƈ参C递给它,而这个进E从shelll承了三个标准文Ӟx准输? QstdinQ,标准输出QstdoutQ和标准出错信息QstderrQ,他们三个的文件号分别????/font>而至于echoq程的工作很单,是参数“hello!”写到标准输出文件中去,通常都是我们的显C器上。但是如果我们将命oҎ“echo hello! > foo”,则在执行时输出将会被重定向到盘文gfoo?font color="#0000FF">Q注Q重定向于文件描q符有关Q?/font>。我们假定在此之前该shellq程只有三个标准文g打开Q文件号分别???Q以上命令行按如下序列执行Q?br />    (1) 打开或创建磁盘文件fooQ如果foo中原来有内容Q则清除原来内容Q其文g号ؓ3?br />    (2) 通过dup()复制文gstdoutQ即文件号1出的filel构指针复制到文件号4处,目的是将stdout的file指针暂时保存一?br />    (3) 关闭stdoutQ即1hӞ但是׃4h件对stdout也同时有个引用,所以stdout文gq未真正关闭Q只是腾?h件号位置?br />    (4) 通过dup()Q复?hӞ即磁盘文件fooQ,׃1h件关闭,其位|空~,?h件被复制?P卌E中原来指向stdout的指针指向了foo?br />    (5) 通过pȝ调用fork()和exec()创徏子进Eƈ执行echoQ子q程在执行echo前夕关闭3号和4hӞ只留???三个文gQ请注意Q这 时的1h件已l不是stdout而是盘文gfoo了。当echo惛_stdout文g写入“hello!”时自然写入到了foo中?br />    (6) 回到shell后,关闭指向foo?号与3h件文Ӟ再用dup()和close()?h复至stdoutQ这样shell恢复了0??三个标准输入/输出文g?br />
    由此可见Q?font color="#FF0000">当echoE序Q或其他Q在q行的时候ƈ不知道stdoutQ对于stdin和stderr同样Q指向什么,q程与实际输出文件或讑֤的结合是在运行时由其父进E“包办”的。这样就化了子进E的E序设计Q因为在设计时只要跟三个逻辑上存在的文g打交道就可以?/font>。可能有Z觉得q很像面向对象中 的多态和重蝲Q没有什么新奇之处,但是如果你活?0甚至40q前Q可能你会改变你的看法。?

calvin 2011-12-13 14:20 发表评论
]]>
端存储和大端存?/title><link>http://www.aygfsteel.com/lihao336/archive/2011/11/15/363850.html</link><dc:creator>calvin</dc:creator><author>calvin</author><pubDate>Tue, 15 Nov 2011 07:36:00 GMT</pubDate><guid>http://www.aygfsteel.com/lihao336/archive/2011/11/15/363850.html</guid><wfw:comment>http://www.aygfsteel.com/lihao336/comments/363850.html</wfw:comment><comments>http://www.aygfsteel.com/lihao336/archive/2011/11/15/363850.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/lihao336/comments/commentRss/363850.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/lihao336/services/trackbacks/363850.html</trackback:ping><description><![CDATA[所有网l协议都是采用big endian的方式来传输数据的。所以有时我们也会把big endian方式UC为网l字节序。当两台采用不同字节序的L通信Ӟ在发送数据之前都必须l过字节序的转换成ؓ|络字节序后再进行传输? <p><wbr> <wbr> <wbr> 判断端q是大端规则的方法:</wbr></wbr></wbr></p><p><wbr>int x = 1;<br /><wbr>if(*(char *)&x == 1)//取x指针强制转换为char*cd再取|此时取到的值是int最低字节?br /><wbr> <wbr> <wbr> <wbr> printf(“little-endian\n?;<br /><wbr>else<br /><wbr> <wbr> <wbr> <wbr> printf(“big-endian\n?;</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></p><p><wbr></wbr></p><p><wbr> <wbr> <wbr> <wbr> 另外补充Q?/wbr></wbr></wbr></wbr></p><p>1QBIG-ENDIAN、LITTLE-ENDIAN、跟CPU有关的,每一UCPU不是BIG-ENDIAN是LITTLE- ENDIAN、。IA架构的CPU中是Little-EndianQ而PowerPC 、SPARC和Motorola处理器。这其实是所谓的L字节序。而网l字节序是指数据在网l上传输时是大头q是头的,在Internet的网l字 节序是BIG-ENDIAN。所谓的JAVA字节序指的是在JAVA虚拟Z多字节类型数据的存放序QJAVA字节序也是BIG-ENDIAN?/p><p>2Q所以在用C/C++写通信E序Ӟ在发送数据前务必用htonl和htonsL整型和短整型的数据进行从L字节序到|络字节序的转换Q而接 收数据后对于整型和短整型数据则必调用ntohl和ntohs实现从网l字节序C机字节序的{换。如果通信的一ҎJAVAE序、一ҎC/C++E? 序时Q则需要在C/C++一侧用以上几个方法进行字节序的{换,而JAVA一侧,则不需要做M处理Q因为JAVA字节序与|络字节序都是BIG- ENDIANQ只要C/C++一侧能正确q行转换卛_Q发送前从主机序到网l序Q接收时反变换)。如果通信的双斚w是JAVAQ则Ҏ不用考虑字节序的? 题了?/p><p><br /></p><p>转自<a >http://www.embest.net/index.php/archives/259</a><br /></p><img src ="http://www.aygfsteel.com/lihao336/aggbug/363850.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/lihao336/" target="_blank">calvin</a> 2011-11-15 15:36 <a href="http://www.aygfsteel.com/lihao336/archive/2011/11/15/363850.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>socket端口bind问题http://www.aygfsteel.com/lihao336/archive/2011/09/11/358464.htmlcalvincalvinSun, 11 Sep 2011 15:47:00 GMThttp://www.aygfsteel.com/lihao336/archive/2011/09/11/358464.htmlhttp://www.aygfsteel.com/lihao336/comments/358464.htmlhttp://www.aygfsteel.com/lihao336/archive/2011/09/11/358464.html#Feedback0http://www.aygfsteel.com/lihao336/comments/commentRss/358464.htmlhttp://www.aygfsteel.com/lihao336/services/trackbacks/358464.html$ netstat -tln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State        
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN    
tcp        0      0 0.0.0.0:40700           0.0.0.0:*               LISTEN    
tcp6       0      0 ::1:631                 :::*                    LISTEN

昄没bind?3端口Q却bindC一个随机的端口40700上?br />后来忽然意识?-1023是保留端口号Q是不是因ؓ13属于reserved port的原因?
修改bind端口?000后,果然可以bind了?br />
原来1-1023是reserved port是以q种方式实现的,而以root权限q行E序Q则可以bind?023以下的端口?br />
q篇文章不错的:
http://www.cnblogs.com/zhangleiccst/archive/2011/05/14/2046465.html


calvin 2011-09-11 23:47 发表评论
]]>
[转]sprintf snprintf strcpy memcpy 区别及应?/title><link>http://www.aygfsteel.com/lihao336/archive/2011/09/11/358442.html</link><dc:creator>calvin</dc:creator><author>calvin</author><pubDate>Sun, 11 Sep 2011 06:45:00 GMT</pubDate><guid>http://www.aygfsteel.com/lihao336/archive/2011/09/11/358442.html</guid><wfw:comment>http://www.aygfsteel.com/lihao336/comments/358442.html</wfw:comment><comments>http://www.aygfsteel.com/lihao336/archive/2011/09/11/358442.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/lihao336/comments/commentRss/358442.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/lihao336/services/trackbacks/358442.html</trackback:ping><description><![CDATA[http://hi.baidu.com/liziyun537/blog/item/ae84671a6a75e9d9ac6e754e.html<br /><br />关于sprintf和snprintf的正?br /><br /> 考虑以下有缺L例子Q?br /> void f(const char *p)<br /> {<br /> char buf[11]={0};<br /> sprintf(buf,"%10s",p); // very dangerous<br /> printf("%sn",buf);<br /> }<br /><br /> 不要让格式标记?10s”误g。如果p的长度大?0个字W,那么 sprintf() 的写操作׃过buf的边界,从而生一个缓冲区溢出?br /> 这cȝ陷ƈ不容易,因ؓ它们只在 p 的长度大?0个字W的时候才会发生。黑客通常利用q类脆弱的代码来入R看上d全的pȝ?br /><br /> 要修正这一~陷Q?b>可以使用函数 snprintf()代替函数sprintf()</b>?br /><br /> 函数原型Qint snprintf(char *dest, size_t n, const char *fmt, ...);<br /> 函数说明: 最多从源串中拷贝nQ?个字W到目标串中Q然后再在后面加一?。所以如果目标串的大ؓn的话Q将不会溢出?br /> 函数q回? 若成功则q回存入数组的字W数Q若~码出错则返回负倹{?br /><br /> 推荐的用法:<br /> void f(const char *p)<br /> {<br /> char buf[11]={0};<br /> snprintf(buf, sizeof(buf), "%10s", p); // 注意Q这里第2个参数应当用sizeof(str)Q而不要用硬~码11Q也不应当用sizeof(str)-1?0<br /> printf("%sn",buf);<br /> }<br /><br /> strcpy 函数操作的对象是 <font color="blue">字符?/font>Q完?<font color="red">? 源字W串 ?目的字符??拯</font> 功能?br /><br /> snprintf 函数操作的对?<font color="blue">不限于字W串</font>Q虽然目的对象是字符Ԍ但是源对象可以是字符丌Ӏ也可以是Q意基本类型的数据。这个函C要用来实?<font color="red">Q字W串或基本数据类型)?字符?的{?/font>功能。如果源对象是字W串Qƈ且指?%s 格式W,也可实现字符串拷贝功能?br /><br /> memcpy 函数֐思义是 <font color="red">内存拯</font>Q实?<font color="red">一? 内存?的内容复制到另一?内存?/font> q一功能。内存块由其首地址以及长度定。程序中出现的实体对象,不论是什么类型,其最l表现就是在内存中占据一席之圎ͼ一个内存区间或块)。因此,memcpy 的操作对象不局限于某一cL据类型,或者说?<font color="blue">适用于Q意数据类?/font>Q只要能l出对象的v始地址和内存长度信息、ƈ且对象具有可操作性即可。鉴?memcpy 函数{长拯的特点以及数据类型代表的物理意义Qmemcpy 函数通常限于同种cd数据或对象之间的拯Q其中当然也包括字符串拷贝以及基本数据类型的拯?br /><br /> 对于字符串拷贝来_用上qC个函数都可以实现Q但是其实现的效率和使用的方便程度不同:<br /><ul><li>strcpy 无疑是最合适的选择Q效率高且调用方ѝ?/li><li>snprintf 要额外指定格式符q且q行格式转化Q麻烦且效率不高?/li><li>memcpy 虽然高效Q但是需要额外提供拷贝的内存长度q一参数Q易错且使用不便Qƈ且如果长度指定过大的话(最优长度是源字W串长度 + 1Q,q会带来性能的下降。其?strcpy 函数一般是在内部调?memcpy 函数或者用汇编直接实现的,以达到高效的目的。因此,使用 memcpy ?strcpy 拯字符串在性能上应该没有什么大的差别?/li></ul><br /> 对于非字W串cd的数据的复制来说Qstrcpy ?snprintf 一般就无能为力了,可是?memcpy 却没有什么媄响。但是,对于基本数据cd来说Q尽可以用 memcpy q行拯Q由于有赋D符可以方便且高效地q行同种或兼容类型的数据之间的拷贝,所以这U情况下 memcpy 几乎不被使用。memcpy 的长处是用来实现Q通常是内部实现居多)对结构或者数l的拯Q其目的是或者高效,或者用方便,甚或两者兼有?br /><br /> strcpy和memcpy功能上也有些差别Q?br /> 比如:<br /> const char *str1="abc\0def";<br /> char str2[7];<br /><br /> 首先用strcpy实现Q?br /> strcpyQstr2,str1Q?br /> 得到l果Qstr2Q?abc";也就是说Qstrcpy是以'\0'为结束标志的?br /><br /> 再用memcpy实现Q?br /> memset(str2,7);<br /> memcpy(str2,str1,7);<br /> 得到l果Qstr2="abc\0def";<br /> 也就是说Qmemcpy是对内存区域的复制。当Ӟ不仅能够复制字符串数l,而且能够复制整型数组{其他数l?img src ="http://www.aygfsteel.com/lihao336/aggbug/358442.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/lihao336/" target="_blank">calvin</a> 2011-09-11 14:45 <a href="http://www.aygfsteel.com/lihao336/archive/2011/09/11/358442.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]C/C++ void 理解http://www.aygfsteel.com/lihao336/archive/2011/09/08/358280.htmlcalvincalvinThu, 08 Sep 2011 03:12:00 GMThttp://www.aygfsteel.com/lihao336/archive/2011/09/08/358280.htmlhttp://www.aygfsteel.com/lihao336/comments/358280.htmlhttp://www.aygfsteel.com/lihao336/archive/2011/09/08/358280.html#Feedback0http://www.aygfsteel.com/lihao336/comments/commentRss/358280.htmlhttp://www.aygfsteel.com/lihao336/services/trackbacks/358280.html
 1.概述
  许多初学者对C/C++语言中的void及void指针cd不甚理解Q因此在使用上出C一些错误。本文将对void关键字的深刻含义q行解说Qƈ详述void及void指针cd的用方法与技巧?br />
  2.void的含?br />
        void的字面意思是“无cd”,void *则ؓ“无cd指针”,void *可以指向Mcd的数据?br />
  void几乎只有“注释”和限制E序的作用,因ؓ从来没有Z定义一个void变量Q让我们试着来定义:

        void a;

  q行语句~译时会出错Q提C“illegal use of type 'void'”。不q,即void a的编译不会出错,它也没有M实际意义?br />
  void真正发挥的作用在于:
  Q?Q?对函数返回的限定Q?br />  Q?Q?对函数参数的限定?/b>

  我们在W三节对以上二点q行具体说明?br />
  众所周知Q如果指针p1和p2的类型相同,那么我们可以直接在p1和p2间互相赋|如果p1和p2指向不同的数据类型,则必M用强制类型{换运符把赋D符双的指针类型{换ؓ左边指针的类型?br />
  例如Q?br />
float *p1;
int *p2;
p1 = p2;

  其中p1 = p2语句会编译出错,提示?=' : cannot convert from 'int *' to 'float *'”,必须改ؓQ?br />
p1 = (float *)p2;

而void *则不同,Mcd的指针都可以直接赋值给它,无需q行强制cd转换Q?br />
void *p1;
int *p2;
p1 = p2;

但这q不意味着Qvoid *也可以无需强制cd转换地赋l其它类型的指针。因为“无cd”可以包容“有cd”,而“有cd”则不能包容“无cd”。道理很单,我们可以说“男人和女h都是人”,但不能说“h是男人”或者“h是女人”。下面的语句~译出错Q?br />
void *p1;
int *p2;
p2 = p1;

  提示?=' : cannot convert from 'void *' to 'int *'”?br />
3.void的?br />
  下面l出void关键字的使用规则Q?br />  规则一 如果函数没有q回|那么应声明ؓvoidcd

  在C语言中,凡不加返回值类型限定的函数Q就会被~译器作回整型值处理?/b>但是许多E序员却误以为其为voidcd。例如:

add ( int a, int b )
{
return a + b;
}
int main(int argc, char* argv[])
{
printf ( "2 + 3 = %d", add ( 2, 3) );
}
  E序q行的结果ؓ输出Q?br />  2 + 3 = 5
  q说明不加返回D明的函数的确为int函数?br />
  林锐博士《高质量C/C++~程》中提到Q“C++语言有很严格的类型安全检查,不允怸q情况(指函C加类型声明)发生”。可是编译器q不一定这么认定,譬如在Visual C++6.0中上qadd函数的编译无错也无警告且q行正确Q所以不能寄希望于编译器会做严格的类型检查?br />
  因此Qؓ了避免؜乱,我们在编写C/C++E序Ӟ对于M函数都必M个不漏地指定其类型。如果函数没有返回|一定要声明为voidcd。这既是E序良好可读性的需要,也是~程规范性的要求。另外,加上voidcd声明后,也可以发挥代码的“自注释”作用。代码的“自注释”即代码能自己注释自己?br />
在C++语言中声明一个这L函数Q?br />
int function(void)
{
return 1;
}

  则进行下面的调用是不合法的:

function(2);

因ؓ在C++中,函数参数为void的意思是q个函数不接受Q何参数?br />
  我们在Turbo C 2.0中编译:

#include "stdio.h"
fun()
{
return 1;
}
main()
{
printf("%d",fun(2));
getchar();
}

  ~译正确且输?Q这说明Q在C语言中,可以l无参数的函C送Q意类型的参数Q但是在C++~译器中~译同样的代码则会出错。在C++中,不能向无参数的函C送Q何参敎ͼ出错提示?fun' : function does not take 1 parameters”?br />
  所以,无论在Cq是C++中,若函C接受M参数Q一定要指明参数为void?br />
  规则?心使用void指针cd

  按照ANSI(American National Standards Institute)标准Q不能对void指针q行法操作Q即下列操作都是不合法的Q?br />
void * pvoid;
pvoid++; //ANSIQ错?br />pvoid += 1; //ANSIQ错?br />//ANSI标准之所以这栯定,是因为它坚持Q进行算法操作的指针必须是确定知道其指向数据cd大小的?br />//例如Q?br />int *pint;
pint++; //ANSIQ正?br />
  pint++的结果是使其增大sizeof(int)?br />
  但是大名鼎鼎的GNU(GNU's Not Unix的羃?则不q么认定Q它指定void *的算法操作与char *一致?br />
因此下列语句在GNU~译器中皆正:

pvoid++; //GNUQ正?br />pvoid += 1; //GNUQ正?br />
pvoid++的执行结果是其增大了1?br />
  在实际的E序设计中,合ANSI标准Qƈ提高E序的可UL性,我们可以q样~写实现同样功能的代码:

void * pvoid;
(char *)pvoid++; //ANSIQ正;GNUQ正?br />(char *)pvoid += 1; //ANSIQ错误;GNUQ正?br />
  GNU和ANSIq有一些区别,M而言QGNU较ANSI更“开䏀,提供了对更多语法的支持。但是我们在真实设计Ӟq是应该可能地q合ANSI标准?br />
  规则?如果函数的参数可以是Lcd指针Q那么应声明其参Cؓvoid *

  典型的如内存操作函数memcpy和memset的函数原型分别ؓQ?br />
void * memcpy(void *dest, const void *src, size_t len);
void * memset ( void * buffer, int c, size_t num );


  q样QQ何类型的指针都可以传入memcpy和memset中,q也真实CC内存操作函数的意义,因ؓ它操作的对象仅仅是一片内存,而不片内存是什么类型。如果memcpy和memset的参数类型不是void *Q而是char *Q那才叫真的奇怪了Q这Lmemcpy和memset明显不是一个“纯_的Q脱MU趣味的”函敎ͼ

下面的代码执行正:

//CZQmemset接受Lcd指针
int intarray[100];
memset ( intarray, 0, 100*sizeof(int) ); //intarray?

//CZQmemcpy接受Lcd指针
int intarray1[100], intarray2[100];

memcpy ( intarray1, intarray2, 100*sizeof(int) ); //intarray2拯lintarray1
  有趣的是Qmemcpy和memset函数q回的也是void *cdQ标准库函数的编写者是多么地富有学问啊Q?br />
  规则?void不能代表一个真实的变量

  下面代码都企图让void代表一个真实的变量Q因此都是错误的代码Q?br />
void a; //错误
function(void a); //错误

  void体现了一U抽象,q个世界上的变量都是“有cd”的Q譬如一个h不是男h是女hQ还有h妖?Q?br />
  void的出现只是ؓ了一U抽象的需要,如果你正地理解了面向对象中“抽象基cZ的概念Q也很容易理解void数据cd。正如不能给抽象基类定义一个实例,我们也不能定义一个voidQ让我们cL的称void为“抽象数据类型”)变量?br />
4.ȝ
  小的void蕴藏着很丰富的设计哲学Q作Z名程序设计h员,寚w题进行深一个层ơ的思考必然我们受益匪浅?


calvin 2011-09-08 11:12 发表评论
]]>
main函数参数的意?/title><link>http://www.aygfsteel.com/lihao336/archive/2011/03/02/345526.html</link><dc:creator>calvin</dc:creator><author>calvin</author><pubDate>Wed, 02 Mar 2011 13:33:00 GMT</pubDate><guid>http://www.aygfsteel.com/lihao336/archive/2011/03/02/345526.html</guid><wfw:comment>http://www.aygfsteel.com/lihao336/comments/345526.html</wfw:comment><comments>http://www.aygfsteel.com/lihao336/archive/2011/03/02/345526.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/lihao336/comments/commentRss/345526.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/lihao336/services/trackbacks/345526.html</trackback:ping><description><![CDATA[int   main( int   argc ,  char  *argv[] ,   char  *envp[] )   <br />     main()函数一般用int或者void形的。我比较喜欢用int型定义main。因为在l束的时候可以返回给操作pȝ一个g表示执行情况?nbsp;  <br /> <br />     int   argc   <br />     q个东东用来表示你在命o行下输入命o的时候,一共有多少个参数。比方说你的E序~译后,可执行文件是test.exe   <br />     D:\tc2>test   <br />     q个时候,argc的值是1   <br />     但是   <br />     D:\tc2>test.exe   myarg1   myarg2  的话Qargc的值是3。也是命o名加上两个参敎ͼ一׃个参?nbsp;  <br /> <br />     char   *argv[]   <br />     q个东东用来取得你所输入的参?nbsp;  <br />     D:\tc2>test   <br />     q个时候,argc的值是1Qargv[0]的值是   "test"   <br />     D:\tc2>test   myarg1   myarg2   <br />     q个时候,argc的值是3Qargc[0]的值是"test"Qargc[1]的值是"myarg1"Qargc[2]的值是"myarg2"?nbsp;  <br />     q个东东一般用来ؓE序提供非常重要的信息,如:数据文g名,{等?nbsp;  <br />     如:copy   a.c   b.txt   <br />     q个时候,a.c和b.txt是所谓的“非常重要的信?#8221;。不指定q两个文Ӟ你没法进行拷贝?nbsp;  <br />     当你的程序用到argc和argvq两个参数的时候,可以单地通过判断argc的|来看看程序的参数是否W合要求   <br /> <br />     char   *envp[]   <br />     q个东东相对来说用得比较。它是用来取得系l的环境变量的?nbsp;  <br />     如:在DOS下,有一个PATH变量。当你在DOS提示W下输入一个命令(当然Q这个命令不是dir一cȝ内部命oQ的时候,DOS会首先在当前目录下找q个命o的执行文件。如果找不到Q则到PATH定义的\径下LQ找到则执行Q找不到q回Bad   command   or   file   name   <br />     在DOS命o提示W下键入set可查看系l的环境变量   <br />     同样Q在UNIX或者LINUX下,也有pȝ环境变量Q而且用得比DOS要多。如常用?PATH,$USER,$HOME{等?nbsp;  <br />     envp保存所有的环境变量。其格式为(UNIX下)   <br />     PATH=/usr/bin;/local/bin;   <br />     HOME=/home/shuui   <br />     卻I   <br />     环境变量??nbsp;  <br />     DOS下大概也一栗?nbsp;  <br />     环境变量一般用来ؓE序提供附加信息。如Q你做了一个显C文本的内容的程序。你x制其一行中昄的字W的个数。你可以自己定义一个环境变量(UNIX下)   <br />     %setenv   NUMBER   =   10   <br />     %echo   $NUMBER   <br />     10   <br />     然后你可以在E序中读入这个环境变量。然后根据其值决定一行输出多个字符。这P如果你不修改环境变量的话Q你每次执行q个E序Q一行中昄的字W数都是不一L   <br />     下面是一个例子程?nbsp;  <br /> <br />     /* argtest.c */   <br /> #include<stdio.h>   <br /> int main(   int   argc   ,   char   *argv[]   ,   char   *envp[]   )   <br /> {   <br />     int   i;   <br /> <br />     printf(   "You   have   inputed   total   %d   argments\n"   ,   argc   );   <br />     for(   i=0   ;   i<argc   ;   i++)   <br />     {   <br />         printf(   "arg%d   :   %s\n"   ,   i   ,   argv[i]   );   <br />     }   <br /> <br />     printf(   "The   follow   is   envp   :\n"   );   <br />     for(   i=0   ;   *envp[i]!='\0'   ;   i++   )   <br />     {   <br />         printf(   "%s\n"   ,   envp[i]   );   <br />     }   <br />     return   0;   <br /> }   <br /> <br /> <br /> D:\>argtest   this   is   a   test   programe   of   main()'s   argments   <br /> You   have   inputed   total   9   argments   <br /> arg0   :   D:\TC\NONAME.EXE   <br /> arg1   :   this   <br /> arg2   :   is   <br /> arg3   :   a   <br /> arg4   :   test   <br /> arg5   :   programe   <br /> arg6   :   of   <br /> arg7   :   main()'s   <br /> arg8   :   argments   <br /> The   follow   is   envp   :   <br /> TMP=C:\WINDOWS\TEMP   <br /> TEMP=C:\WINDOWS\TEMP   <br /> PROMPT=$p$g   <br /> winbootdir=C:\WINDOWS   <br /> PATH=C:\WINDOWS;C:\WINDOWS\COMMAND   <br /> COMSPEC=C:\WINDOWS\COMMAND.COM   <br /> SBPCI=C:\SBPCI   <br /> windir=C:\WINDOWS   <br /> BLASTER=A220   I7   D1   H7   P330   T6   <br /> CMDLINE=noname   this   is   a   test   programe   of   main()'s   argments     <br /> -----------------------------------------------------------------------------------------<br /> 命o行参数啊 argc   是参数的个数Qargv[]是参敎ͼargv[0]是文件名Qargv[1]是第一个参?..   <br /> 如你得exe文g名是:myprog.exeQ那?nbsp;  <br /> myprog   12   22   32   <br /> 则argv[0]="myprog"Qargv[1]="12"Qargv[2]="22"...   <br /> <br /> <br /> <img src ="http://www.aygfsteel.com/lihao336/aggbug/345526.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/lihao336/" target="_blank">calvin</a> 2011-03-02 21:33 <a href="http://www.aygfsteel.com/lihao336/archive/2011/03/02/345526.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ǩ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ӫɽ</a>| <a href="http://" target="_blank">촨</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">̨</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">˻</a>| <a href="http://" target="_blank">Ɽ</a>| <a href="http://" target="_blank">ԫ</a>| <a href="http://" target="_blank">Ϻ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">̶</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ʤ</a>| <a href="http://" target="_blank">᰸</a>| <a href="http://" target="_blank">Ԫ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ԫ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ͳ</a>| <a href="http://" target="_blank">ׯ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>