为什么argc在只传递了1个参数的情况下返回2

Why does argc returns 2 when only 1 argument was passed?

本文关键字:参数 情况下 返回 1个 argc 为什么      更新时间:2023-10-16

我写了这段简单的代码来了解参数系统是如何工作的。我把一个文本文件拖到.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。链接中的问题是另一个。。。

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库等同物。

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

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

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

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" ) );

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

相关文章: