为什么只传递1个参数时argc返回2?

时间:2015-06-29 09:26:19

标签: c++

我写了这个简单的代码来理解参数系统是如何工作的。我将一个文本文件拖到.exe文件中,得到2作为输出,而不是我预期的1。 为什么2? Arg 1是.exe本身吗?我怎样才能找到参数的文件名?

#include<iostream>
using namespace std;

int main(int argc, char* argv[])
{
    int i = 0;
    const int max = 100000;

    if (argc > 0)
    {
        cout<< argc <<endl;
    }

    cin.get(); cin.get();

  return 0;
}

还有一个问题。我在哪里可以告知如何访问每个参数并使用信息。我的目标是打开作为参数传递给.exe的所有文件。

这不是一个重复的问题,我问为什么在传递1个参数时会返回2。链接中的问题是另一个......

3 个答案:

答案 0 :(得分:4)

argv[0]通常是正在运行的程序的名称,并计入argc。如果argc >= 2,则您的第一个文本文件名应位于argv[1]中。你可以简单地循环它们......

for (size_t i = 1; i < argc; ++i)
    if (std::ifstream infile(argv[i]))
        ...use infile...
    else
        std::cerr << "ERROR - unable to open " << argv[i] << '\n';

对于更复杂的要求,如果您的系统提供了getopt()等,或者boost library equivalents,您可能需要使用{{3}}等。

答案 1 :(得分:1)

根据C ++标准(3.6.1主要功能)

  
      
  1. ...如果argc非零,则这些参数应在argv [0]中提供   通过argv [argc-1]作为指向初始字符的指针   以null结尾的多字节字符串(ntmbs s)(17.5.2.1.4.2)和 argv [0]   应该是指向ntmbs的初始字符的指针   表示用于调用程序的名称或“”
  2.   

要输出所有参数,您可以使用各种方法,例如

for ( char **s = argv; *s; ++s ) std::cout << *s << std::endl;

for ( int i = 0; i < argc; i++ ) std::cout << argv[i] << std::endl;


#include <algorithm>
#include <iterator>
//...
std::copy( argv, argv + argc, std::ostream_iterator<char *>( std::cout, "\n" ) );

答案 2 :(得分:1)

main的第一个参数始终是执行文件的名称(表示.exe文件名) 这就是为什么argc的值是2(程序名称为1,而.txt文件为其他值) 你可以通过打印argv [0]

来检查它