打印通过命令行传递的参数
Printing arguments passed through the command line
我尝试打印通过命令行传递的参数,如下所示:
#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]
你会得到你所期望的。
相关文章:
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 如何处理linux终端中带有负号(-)的C++中的命令行参数
- 使用 C++ 将命令行参数拆分为参数/向量
- 如何在OMNET++中添加专门的命令行参数?
- 如何在不传递命令行参数的情况下在 c++ 中设置环境变量
- atoi() 在应用于大型命令行参数时会产生不正确的值
- 是否可以在命令行中将输入参数传递给可执行文件
- 命令行参数,cant 或两个变量
- 在 Windows 中使用 boost::p rogram_options 从命令行参数读取 Unicode 字符
- 如何在 Android/NDK 上将命令行参数从 gradlew.bat 传递到 Clang
- 编写一个将 LLVM IR 文件作为命令行参数的程序
- 通过命令行参数获取llvm ir文件时面临问题
- 有没有办法根据命令行参数定义数组大小?运行时与编译时实例化?
- 从命令行获取参数时出现问题
- 如何在不使用文件扩展名的情况下使用命令行参数打开C++中的文本文件?
- 命令行参数在不到 3 个 LOC 中 int?
- 在命令行参数中使用引号
- 使用参数 + stdout + stderr 从命令行调用 MFC 应用程序
- 在VS2013中使用devenv (C++)传递命令行参数argv
- 二进制数据作为命令行参数