为啥只传递 1 个参数时 argc 返回 2? [复制]

Posted

技术标签:

【中文标题】为啥只传递 1 个参数时 argc 返回 2? [复制]【英文标题】:Why does argc returns 2 when only 1 argument was passed? [duplicate]为什么只传递 1 个参数时 argc 返回 2? [复制] 【发布时间】:2015-09-15 16:59:53 【问题描述】:

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

【问题讨论】:

程序总是至少接收 1 个参数,即程序的名称。 为什么没有输出argv的值?那会回答你自己的问题。 为什么这个问题得到如此多的反对票?我看到的唯一“错误”是问题非常基本。但它解释了询问者迄今为止的尝试,甚至提供了一个最小的例子。 @EdwardBlack 也许“研究努力”还不够。如果您知道argc 是什么,但对坐在它旁边的argv 的含义一点也不好奇,那么这些反对票可能是有道理的。 这就像在说“阅读这本 C++ 书,那里都有解释” 【参考方案1】:

根据C++标准(3.6.1主函数)

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

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

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】:

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

【讨论】:

【参考方案3】:

argv[0] 通常是正在运行的程序的名称,并计入argc。如果argc &gt;= 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。

【讨论】:

谢谢,这也回答了我关于如何输出参数文件名的问题。

以上是关于为啥只传递 1 个参数时 argc 返回 2? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥 argv[argc] 是指向 NULL 的指针?

为啥 main(int argc, char* argv[]) 需要两个参数? [复制]

用 int main(void) 编译失败; main(int argc, char *argv[]) 成功。为啥?

为啥PHP传递参数值为0时,empty判断参数为真

awk从入门到入土(23)awk内置变量ARGCARGC--命令行参数传递

awk从入门到入土(23)awk内置变量ARGCARGC--命令行参数传递