0

如果我在 Visual Studio 2013 下编译此代码

int main(int argc, char* argv[])
{
std::cout << "arg count: "<< argc << "/n";
}

然后在没有附加参数的情况下运行它(即>program.exe),它会输出

arg count: 1

它输出 1 个参数 (>program.exe arg1)

arg count: 2

但这就是奇怪的地方。如果我输入(>program.exe arg1 arg2)它输出

arg count: 2

“arg count”应该是3,不是吗?

使用 (>program.exe arg1 arg2 arg3) 它输出

arg count: 2

在这种情况下应该是 4...

出于某种原因,打印 argv[3] 可以正常工作。

为什么会这样?

4

3 回答 3

2

C++ 标准的部分3.6.1定义了如何main及其参数的工作方式:

在后一种形式中,为了便于说明,第一个函数参数称为argc,第二个函数参数称为argv,其中argc应该是从程序运行的环境传递给程序的参数数量。如果argc不为零,则应在argv[0]argv[argc-1]中提供这些参数,作为指向以空字符结尾的多字节字符串 (ntmbs s) (17.5.2.1.4.2) 的初始字符的指针,并且argv[0]应是指向 ntmbs 的初始字符的指针,该字符表示用于调用程序的名称或“”。argc的值应为非负数。 argv[argc] 的值应为 0。[ 注意:建议在 argv 之后添加任何其他(可选)参数。——尾注]

这意味着使用符合标准的编译器,您应该能够访问argv[argc]. argv[n]但是,使用 n >访问argc是未定义的。它可能会崩溃,但不是必须的。

您所经历的很奇怪,因为显然这些参数是作为单个参数处理的。如果您完全按照说明提供参数,则不应发生这种情况。

您应该修复main. 该标准至少保证这两个签名,其他任何内容都是实现定义的:

— () 的函数返回 int 和

— (int, pointer to pointer to char) 返回 int 的函数

当您想要访问参数时,适当的签名是int main(int argc, char** argv).

于 2014-02-23T12:59:36.353 回答
1

好的,事实证明,问题出在我在这里没有包含的一些代码中。我的代码是:

if (argc = 2) { do some stuff }

应该是

if (argc == 2) { do some stuff }

我觉得真的很愚蠢:\

于 2014-02-23T13:42:09.410 回答
0

I can guess that either you enter as

(>program.exe "arg1 arg2"

or

(>program.exe arg1,arg2
于 2014-02-23T13:35:37.530 回答