我是C ++的初学者,我习惯使用int main()进行编码,现在我正在使用:
int main(int argc, char **argv)
我并不确切知道这行代码的含义。所以,我在互联网上查找了一些答案,我发现了这段代码:
std::cout << "Have " << argc << " arguments:" << std::endl;
for (int i = 0; i < argc; ++i) {
std::cout << argv[i] << std::endl;
}
这向我展示了我的论点。
我运行应用程序,控制台显示:
有1个参数:
C:\ Users \ user \ Documents \ C ++ Projects \ Test \ bin \ Debug \ Test.exe
然后它关闭了应用程序,因为在这个循环之后我有一个基于argc值的if else语句。
因此,如果argc与3不同,则会运行exit(0)
。
我的问题是:
为什么我的参数只是我自己的应用程序位于调试路径上?
我怎样才能获得多个论点?
答案 0 :(得分:10)
argc
是用于运行程序的参数数量
argv
是一个char*
参数数组
argv[0]
是可执行文件的名称(在您的情况下,它是Test.exe
)
argv[1]
是你传入的第一个参数(如果你传入了任何参数)。
因此,如果您将计划作为Test.exe a b
运行,则argc
将为3,argv
的内容将为:
argv[0]
是Test.exe
argv[1]
是a
argv[2]
是b
答案 1 :(得分:1)
您可能尝试在终端或命令行中运行应用程序,也许
.\Test.exe one two
然后argc
应为3,argv[0]
可能为.\Test.exe
,argv[2]
为two
。我让你通过使用自己喜欢的调试器来试验argv[1]
。
(实际上我并不了解Windows,但我将我在Linux上所知的内容转换为您专有的Microsoft操作系统)
请注意,在Linux或Posix系统上,如果在命令行上使用globbing,如
/bin/ls -l a*
调用shell将a*
扩展为单词序列,扩展序列由execve(2)传递给{{1}可执行文件。
谣言说在Windows上并非如此。某些Microsoft等效的Crt0可能会进行全局扩展。阅读Microsoft文档。
AFAIK,保证(至少在Linux和Posix系统上)/bin/ls
是argv[argc]
指针。
答案 2 :(得分:1)
int argc, char **argv
表示命令行参数。我的意思是,如果你通过cmd / terminal运行应用程序:
>mypath\test.exe a b c d
^^ these arguments
argv[0]
始终是可执行文件的路径。 argc
是参数的数量。
答案 3 :(得分:1)
如果从Visual Studio运行,则可以在“项目属性”中添加参数。右键单击正在运行的项目,选择“属性”。在“调试”选项卡中,有一个命令行参数的输入框。在那里输入。
对于代码块,see here。
答案 4 :(得分:1)
argc
代表argument count
- argc存储本身在运行时传递的参数总数
argv
代表argument value
- argv本身存储参数本身。
第一个参数argv[0]
是(可执行)文件的绝对路径
之后,每个argv[n]
(n&lt; argc)将有一个参数,存储为char*
字符串(即使你传递了一个数字)
那就是全部。
答案 5 :(得分:0)
第一个参数始终是调用的程序名,其他参数是在命令行上传递的参数
换句话说,argv
复制了名为:
myprog arg1 arg2
第一个参数需要注意的重要一点是,它可以用来区分主程序的不同行为,具体取决于程序名称(可以通过例如使用符号链接而有所不同)。一个很好的示例是gzip
和gunzip
的工作原理。