为什么argc在只传递了1个参数的情况下返回2
Why does argc returns 2 when only 1 argument was passed?
我写了这段简单的代码来了解参数系统是如何工作的。我把一个文本文件拖到.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主要功能)
- 。。。如果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]来检查
相关文章:
- 在没有参数列表的情况下使用模板名称"Event"无效,模板问题
- 在不传递参数数量且只有3个点的情况下,如何使用变差函数
- G++ C++17 类模板参数推导在非常特殊的情况下不起作用
- 如何在不知道C++中有多少可选参数的情况下在循环中使用va_arg?
- 如何在不强制转换每个参数的情况下删除初始值设定项列表中从 int 到 char 的缩小转换?
- 如何在不使用指针的情况下将派生类的对象作为参数传递给基类中的函数?
- 如何在不传递命令行参数的情况下在 c++ 中设置环境变量
- C++有什么方法可以在既不调用函数模板也不提供其模板参数的情况下引用函数模板?
- 是否可以在不填充自己的参数的情况下将模板函数作为参数传递?
- 我应该如何在没有变量的情况下将相同的参数传递给 CMAKE 中的多个目标?
- 是否可以在不扣除的情况下将模板参数转发到 make_*?
- 为什么或在什么情况下,你会将参数作为C++中的引用(或指针)传递给函数?
- 如何在给定 std::variant 的情况下检索模板参数包?
- 在C++中,有没有一种方法可以让我在不传递参数的情况下拥有一个函数
- 如何在没有参数包的情况下编写变差函数
- 如何在不使用文件扩展名的情况下使用命令行参数打开C++中的文本文件?
- 此函数如何在不传递任何参数的情况下工作?
- 在什么情况下,使用'const T*'输入参数比'const T&'更可取?
- 如何在没有可变参数函数的情况下循环函数的参数
- 是否有可能在没有复制的情况下传递 std::vector<int> 作为参数来获得 std::vector<std::array<int, 3>>?