int main(int argc, char *argv[])
在程序中,有时可以使用
argv[1]
来获取参数。什么时候我们会使用
argv[1]
而不是argv[0]
呢?只有当我们想要读取命令行中的第二个参数时才使用吗?int main(int argc, char *argv[])
argv[1]
来获取参数。argv[1]
而不是argv[0]
呢?只有当我们想要读取命令行中的第二个参数时才使用吗?按照惯例,argv[0]
表示当前程序的名称(或路径),argv[1]
到 argv[argc - 1]
则是用户提供的命令行参数。
然而,这并不一定是真实情况-- 程序可以使用特定于操作系统的功能来绕过此要求,这种情况经常发生,您应该意识到这一点。(不过,即使您意识到了这一点,我不确定您能做什么...)
例如:
gcc -O3 -o temp.o "My file.c"
应该会产生以下参数:
argc: 5
argv: ["gcc", "-O3", "-o", "temp.o", "My file.c"]
因此,说argv[0]
将引用gcc
,而不是-O3
。
argv
是一个指针数组,该数组中的每个指针都存储来自命令行的一个参数。因此,argv[0]
是第一个参数(即可执行文件/程序本身),argv[1]
是第二个参数,以此类推!
参数的总数由 argc
决定。
argv[0]
是可执行文件本身,那术语的问题又有什么关系呢?你讨论的只是术语,而不是概念或程序如何工作的问题! - Nawazargv[0] 是程序的执行路径,argv[1] 是程序的第一个参数
假设您的C++可执行文件是:
/home/user/program
(在Windows中为C:\program.exe
)
如果您执行:
./home/user/program 1 2
(在Windows中为C:\program.exe 1 2
)
argv[0] = /home/user/program
(C:\program.exe
)
argv[1] = 1
argv[2] = 2
这是因为:
argv [0]
是可执行文件的路径argv [1]
是第一个参数编辑:
我现在看到argv [0]
不一定是可执行文件的路径。
请阅读以下SO问题:Is args [0] guaranteed to be the path of execution?
argc == 1
,则 argv[1]
不存在。argc
不是参数的数量,而是 argv
的大小(比参数数量多 1)。 - Chris Lutzargc == 1
,则argv [1] == 0
。§3.6.1/2明确指出argv [argc] == 0
。 - David Rodríguez - dribeas是的,基本上就是这样,argv [1]
是第二个命令行参数。第一个命令行参数是程序本身的名称。
或者,为了避免这个答案最初存在的语义混乱和其他人的评论,可以将 argv [0] 称为“零”参数,这样 argv [1]
就成为用户提供的值中的“第一”个。
无论如何,这来自于 exec()
函数族,例如具有用法的 execl
:
int execl(const char *path, const char *arg0, ... /*, (char *)0 */);
在(Unix)shell中,当你键入命令时,如果必要的话,shell首先会解析命令名称(使用$PATH
),以查找真正的绝对路径。绝对或相对路径作为path
提供,并且最初键入的命令作为arg0
提供,最终成为程序中的argv [0]
。
其余的命令行参数最终变成argv[1]
等。
简短的回答是,数组包含传递到程序中的所有选项。
由于argv [0]是程序本身的文件路径。 额外的命令行参数在进一步的索引中,argv [1],argv [2]等。 您可以在此处阅读更多信息: {{link1:http://www.site.uottawa.ca/~lucia/courses/2131-05/labs/Lab3/CommandLineArguments.html}}
argc
的值大于零,argv [0]
指向的字符串表示程序名称;如果主机环境不提供程序名称,则argv[0][0]
应该是空字符。 如果argc
的值大于1,则argv [1]
到argv [argc-1]
指向的字符串表示程序参数。 - Chris Lutzargv[argc]
的值应为'0'
(§3.6.1/2 [...] argv [argc] 的值必须为0。) - David Rodríguez - dribeasexec
来欺骗程序,让它认为自己的名字是其他的东西,那么我们应该期望这个程序会认为它的名字是我们告诉它的任何东西,不是吗?因此,一个程序应该相信argv[0]
就是它的名字,如果我们欺骗了我们的子程序,我们应该感到适当的羞耻。 ;) - Chris Lutz