int main(int argc,char ** argv)

时间:2014-08-15 20:01:21

标签: c++

我是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)

我的问题是:

为什么我的参数只是我自己的应用程序位于调试路径上?

我怎样才能获得多个论点?

6 个答案:

答案 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.exeargv[2]two。我让你通过使用自己喜欢的调试器来试验argv[1]

(实际上我并不了解Windows,但我将我在Linux上所知的内容转换为您专有的Microsoft操作系统)

请注意,在Linux或Posix系统上,如果在命令行上使用globbing,如

 /bin/ls -l a*

调用shella*扩展为单词序列,扩展序列由execve(2)传递给{{1}可执行文件。

谣言说在Windows上并非如此。某些Microsoft等效的Crt0可能会进行全局扩展。阅读Microsoft文档。

AFAIK,保证(至少在Linux和Posix系统上)/bin/lsargv[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

第一个参数需要注意的重要一点是,它可以用来区分主程序的不同行为,具体取决于程序名称(可以通过例如使用符号链接而有所不同)。一个很好的示例是gzipgunzip的工作原理。