打印通过命令行传递的参数

时间:2015-06-15 16:18:26

标签: c++

我尝试打印通过命令行传递的参数,如下所示:

#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

DEMO

这不是我的预期。我期待这样的事情:

first
second
__some_garbage_data__    

二进制名称是否始终被视为索引为0的参数?

5 个答案:

答案 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]

你会得到你所期待的。