我尝试打印通过命令行传递的参数,如下所示:
#include<iostream>
int main(int argc, char ** argv)
{
std::cout << argv[0] << std::endl;
std::cout << argv[1] << std::endl;
std::cout << argv[2] << std::endl;
}
但失败了。输出是:
./a.out
first
second
这不是我的预期。我期待这样的事情:
first
second
__some_garbage_data__
二进制名称是否始终被视为索引为0
的参数?
答案 0 :(得分:2)
是的,这是预期的行为。来自[basic.start.main],强调我的:
如果
argc
非零,则这些参数 应在argv[0]
到argv[argc-1]
中提供,作为指向以null结尾的初始字符的指针 多字节字符串(ntmbs s)(17.5.2.1.4.2)和argv[0]
应该是指向a的初始字符的指针 ntmbs代表用于调用程序的名称或“”。argc
的值应为非负数。argv[argc]
的值应为0
。
答案 1 :(得分:1)
在大多数语言中,第一个参数是程序本身。在您的情况下,argv [0]将始终打印./a.out
答案 2 :(得分:0)
arg [0]存储被调用程序的名称,之后argv存储在命令行中传递的参数。
$。/ a.out你好嗨
0 1 2
所以
argv[0]=a.out
argv[1]=hello
argv[2]=hi
答案 3 :(得分:0)
argv[0]
不仅显示文件名,还显示路径,例如,如果您运行程序而未将目录更改为程序目录,则会显示如下所示的输出(窗口):
C:\Users\username\desktop\program.exe
。
在linux上,就像你的示例输出./a.out
,其中./
代表当前目录。
答案 4 :(得分:-1)
每当从命令行调用程序时,其第0个参数将成为文件/命令本身的名称。所以基本上,你传递的参数是从数组的第一个成员开始的。
如果你包括
cout << argv[3]
你会得到你所期待的。