int main( int argc , char* argv[] ) 的问题

一般的资料都说argc是参数个数,argv是指向参数的指针数组,argv[0]指向的是程序名字符串,我想问下这个字符串是不是一定就是包含这个main函数的可执行文件的名字。比如说我写了一个测试文件,test_arg.c,然后生成了一个exe文件test_arg.exe,里面包含printf( %s ,argv [ 0 ] )这样的语句,那么假如我在命令行输入test.exe 1 2 3,那么argc为4,argv[0]是test.exe。那么在其他情况下会不会出现argv[0]不是在命令行输入的程序的情况?把这个传给main函数有什么用?貌似参数比较有用吧?因为如果要执行这个main函数,就必须在命令行键入exe文件的名字,再把这个传给main函数是做什么啊?
那是不是传给main函数的argv[0]一定是包含这个main函数的可执行文件的名称?

完整地解答这个问题:
argc=argument count; 自动计算命令行有几个参数
argv=argument vector; 将命令行的参数名字分别置于各个字符串指针中。
注意这里的类型:argc是整数类型,不多解释。char* argv[]是字符串指针。

用你的例子来说,test.exe 1 2 3,那么
argc=4;
argv[0]="test.exe"; argv[1]="1"; argv[2]="2"; argv[3]="3";

至于应用的话,举个很常见的例子:
比方说,你的main函数需要打开一个文件,对文件进行操作,而且希望用户在命令行的第二个位置就直接输入(i.e., argv[1]的位置),那么可以写如下程序(我写的比较简略,没有编译,因为比较简单。。。):
int main(int argc, char* argv[]){
if(argv!=2){
cout << "请输入test.exe fileName格式执行"; //这里是输出错误;在C里面是printf
return 0; //退出main程序;
} else{
instream in_stream; //这里我用的是C++的方法,在C里面应该是fopen吧。注意加相对应的library调用;C++里面是fstream;C里面是stream.h?我有点忘了。。。
instream.open(argv[1]); //因为上面已经对于argument的数量进行判断,所以可以打开(如果有这个文件的话)
.....
return 0; //执行完退出
}

对于你补充的问题,虽然没有见过一本书提过main函数的argv[0]一定是包含这个main函数的可执行文件的名称,但是,我觉得应该不对,因为执行的时候可能在前面加上另外的前缀,如(在linux情况下):
sudo text.exe fileName
这里sudo是argv[0],text.exe是argv[1],fileName是argv[2]。
当然在大多数情况下,argv[0]是这个main函数的可执行文件的名称。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-02-09
在VC下可生成DEBUG或RELEASE模式的exe文件。由于argv [ 0 ] 包含了路径名,这样可通过它知道当前执行的是哪一个模式的exe文件。

是的,传给main函数的argv[0]一定是包含这个main函数的可执行文件的名称。
相似回答