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

Printing arguments passed through the command line

本文关键字:参数 命令行 打印      更新时间:2023-10-16

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

#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的参数?

是的,这是预期的行为。从[basic.start.main]开始,强调我的:

如果argc不为零,则这些参数 应以argv[0] argv[argc-1]提供,作为指向以 null 结尾的初始字符的指针 多字节字符串 (NTMBS s) (17.5.2.1.4.2) 和 argv[0] 应是指向 NTMB,表示用于调用程序或"的名称argc的值应为非负值。 argv[argc]的价值应0

在大多数语言中,第一个参数是程序本身。在您的情况下,argv[0] 将始终打印 ./a.out

arg[0] 存储被调用程序的名称,之后 argv 存储命令行中传递的参数。

$./a.out 你好嗨

 0     1   2

所以

 argv[0]=a.out
 argv[1]=hello
 argv[2]=hi

argv[0]不仅显示文件名,还显示路径,例如,如果您运行程序而没有将目录更改为程序目录,则会显示如下所示的输出(Windows):

C:Usersusernamedesktopprogram.exe .

在 linux 上,就像您的示例输出./a.out其中 ./ 表示当前目录。

每当从命令行调用程序时,其第 0 个参数将是文件/命令本身的名称。所以基本上,你传递的参数是从数组的第一个成员开始的。

如果您包括

cout << argv[3]

你会得到你所期望的。