如果我在Visual Studio 2013下编译此代码
int main(int argc, char* argv[])
{
std::cout << "arg count: "<< argc << "/n";
}
然后运行它而没有其他参数(即&gt; program.exe),它输出
arg count: 1
使用1个参数(&gt; program.exe arg1)输出
arg count: 2
但这是奇怪的地方。如果我输入(&gt; program.exe arg1 arg2),则输出
arg count: 2
“arg count”应该是3,不应该吗?
与(&gt; program.exe arg1 arg2 arg3)输出
arg count: 2
在这种情况下它应该是4 ......
打印argv [3]因某种原因工作正常。
为什么会这样?
答案 0 :(得分:2)
C ++标准的3.6.1
部分定义了main
及其参数的工作原理:
在后一种形式中,出于说明的目的,第一个函数参数是 名为 argc ,第二个函数参数名为 argv ,其中 argc 应为参数个数 从运行程序的环境传递给程序。如果 argc 非零,则这些参数 应在 argv [0] 中通过 argv [argc-1] 提供,作为指向null终止的初始字符的指针 多字节字符串(ntmbs s)(17.5.2.1.4.2)和 argv [0] 应该是指向a的初始字符的指针 表示用于调用程序或“”的名称的ntmbs。 argc 的值应为非负值。 argv [argc]的值应为0 。 [注意:建议任何其他(可选)参数 在argv之后添加。 - 后注]
这意味着使用符合标准的编译器,您应该能够访问argv[argc]
。
使用n&gt;访问argv[n]
argc
虽然未定义。它可能会崩溃,但不一定。
你所经历的是奇怪的,因为显然这些论据是作为一个参数处理的。如果您完全按照规定提供参数,则不应发生这种情况。
您应该修复main
的签名。该标准至少保证了这两个签名,其他任何东西都是实现定义的:
- ()返回int和
的函数- 返回int
的函数(int,指向char的指针)
由于您要访问参数,相应的签名为int main(int argc, char** argv)
。
答案 1 :(得分:1)
好的,事实证明,问题出现在一些我没有在这里包含的代码中。我的代码是:
if (argc = 2) { do some stuff }
应该是
if (argc == 2) { do some stuff }
我真的觉得很蠢:\
答案 2 :(得分:0)
我猜你要么输入
(&gt; program.exe“arg1 arg2”
或
(>program.exe arg1,arg2