如果我有这个:
int main(int argc, char *argv[])
在正文中,您有时可以找到使用argv[1]
.
我们什么时候使用argv[1]
over argv[0]
?只有当我们只想读取命令行中的第二个参数时?
按照约定,argv[0]
是当前程序的名称(或路径),而argv[1]
throughargv[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]是程序的执行路径,argv[1]是程序的第一个参数
假设您的C++可执行文件是:
/home/user/program
(或C:\program.exe
在 Windows 中)
如果你执行:
./home/user/program 1 2
(或C:\program.exe 1 2
在 Windows 中)
argv[0] = /home/user/program
( C:\program.exe
)
argv[1] = 1
argv[2] = 2
那是因为:
argv[0]
是可执行文件的路径argv[1]
是第一个论点编辑:
现在我看到这argv[0]
不一定是可执行文件的路径。
阅读以下 SO 问题:是否保证 args[0] 是执行路径?
是的,主要是这样,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].. 你可以在这里阅读更多: http ://www.site.uottawa.ca/~lucia/courses/2131-05/labs/Lab3 /CommandLineArguments.html