4

如果我有这个:

int main(int argc, char *argv[])

在正文中,您有时可以找到使用argv[1].

我们什么时候使用argv[1]over argv[0]?只有当我们只想读取命令行中的第二个参数时?

4

7 回答 7

12

按照约定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

于 2011-03-07T08:28:06.237 回答
6

argv是一个指针数组,这个数组中的每个指针都存储一个来自命令行的参数。argv[0]第一个参数(即可执行文件/程序本身)也是如此argv[1],第二个参数也是如此,依此类推!

参数的总数由 决定argc

于 2011-03-07T08:27:56.533 回答
2

argv[0]是程序的执行路径,argv[1]是程序的第一个参数

于 2011-03-07T08:26:51.777 回答
2

假设您的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] 是执行路径?

于 2011-03-07T08:26:55.210 回答
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]结尾。

于 2011-03-07T08:26:11.397 回答
0

简短的回答是肯定的,数组包含传递给程序的所有选项。

于 2011-03-07T08:26:38.837 回答
0

因为 argv[0] 是程序本身的文件路径。额外的命令行参数在进一步的索引中,argv[1],argv[2].. 你可以在这里阅读更多: http ://www.site.uottawa.ca/~lucia/courses/2131-05/labs/Lab3 /CommandLineArguments.html

于 2011-03-07T08:28:27.130 回答