如果我有这个:
int main(int argc, char *argv[])
在正文中,您有时可以使用argv[1]
找到程序。
我们何时使用argv[1]
而不是argv[0]
?是否只是在我们只想在命令行中读取第二个参数时?
答案 0 :(得分:12)
按惯例,argv[0]
是当前程序的名称(或路径),argv[1]
到argv[argc - 1]
是<用户提供的strong>命令行参数。
但是,这并不 为真 - 程序可以通过OS特定的功能来绕过这个要求,这种情况经常发生,你应该知道它。 (我不确定即使你知道它也能做很多事情,但是......)
示例:
gcc -O3 -o temp.o "My file.c"
会(应该)产生以下参数:
argc: 5
argv: ["gcc", "-O3", "-o", "temp.o", "My file.c"]
所以说argv[0]
会将gcc
,而不是引用到-O3
。
答案 1 :(得分:5)
argv
是一个指针数组,此数组中的每个指针都存储一个来自命令行的参数。所以argv[0]
是第一个参数(即可执行文件/程序本身),argv[1]
是第二个参数,依此类推!
参数总数由argc
确定。
答案 2 :(得分:3)
假设您的 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?
答案 3 :(得分:2)
argv [0]是程序的执行路径,argv [1]是程序的第一个参数
答案 4 :(得分:0)
是的,主要是它,argv[1]
是第二个命令行参数。第一个命令行参数是程序本身的名称。
或者,为了避免此答案最初具有的语义混乱以及其他人的评论,将argv [0]称为第0个参数可能是有意义的,因此argv[1]
现在将是用户提供的值的“第一”。
无论如何,这来自exec()
系列功能,例如execl
有用法:
int execl(const char *path, const char *arg0, ... /*, (char *)0 */);
在(Unix)shell中键入命令时,如果需要,shell首先解析命令名(使用$PATH
)以查找实际的绝对路径。 ({1}}提供(绝对或相对)路径,最初输入的命令以path
提供,最终成为程序中的arg0
。
剩余的命令行参数最后以argv[0]
等结尾。
答案 5 :(得分:0)
简短答案是肯定的,数组包含传递给程序的所有选项。
答案 6 :(得分:0)
as argv [0]是程序本身的文件路径。 额外的命令行参数在其他索引中,argv [1],argv [2] .. 你可以在这里阅读更多 : http://www.site.uottawa.ca/~lucia/courses/2131-05/labs/Lab3/CommandLineArguments.html