强制写入int main(int argc,char * argv []),不能使用其他名称而不是argc和* argv []?

问题描述:

我在这里给项目选项本身(在'配置属性' - >'调试')给Visual Studio的命令行参数有一些真正的麻烦。强制写入int main(int argc,char * argv []),不能使用其他名称而不是argc和* argv []?

在“int main(int main_i)”无效后,我写了这个“int main(int argc)”。在MS Visual Studio属性页面的项目命令行参数中,我不确定我应该写什么。我只想传递一个整数来指定一个文件是读取还是写入,因此仅仅是一个int argc。我不需要char *argv[]。我在命令行参数文本框中尝试了一些值,但它在执行时没有到达exe文件,它显示了我根本没有输入的内容。

你能给我提供一个简单的例子吗?我需要在MSVS C++ Property Pages的命令行参数空间中输入什么内容?我简直无法找到关于如何将命令行参数提供给MSVS的示例。

我也不明白为什么我需要重建整个项目,即使当我只修改命令行参数值?

+0

传给你编的Ints不会进入argc。再次阅读该教程。 – 2012-07-15 04:37:54

如果您希望程序理解单个整数命令行参数,则仍需使用argcargv。像这样的东西应该做到这一点:

int main(int argc, char *argv[]) { 

    if (argc < 2) { 
     fprintf(stderr, "Need a command line argument.\n"); 
     exit(1); 
    } 

    int arg = atoi(argv[1]); 
    // now you have an integer 
    // do whatever with it... 
} 

C标准要求main功能有参数的具体设置。允许的组合之一是(int, char *[])。你可以名称任何你想要的参数,但他们几乎总是被称为argcargv

只是一套行之有效的惯例,你可以使用任何你想要的名称(虽然它可能会引起一些眉毛),已使用参数按照指定的顺序不过,我只看到代码。

在ANSI之前的日子里,可以简单地拥有int main(),而且它仍然是..但通常会提供argcargv

您不能只提供其中一个参数。

+0

在post-ANSI的日子里,仍然有可能拥有'int main()'(你似乎暗示过)。 – 2012-07-15 04:29:12

+1

@SethCarnegie你认为我需要更加明确吗?我想通过鼓励使用'argc','argv'来促进“良好实践”。 – Levon 2012-07-15 04:30:28

+0

我不认为使用'argc'和'argv'必然是一种好的做法。有时你需要它,有时你不需要。我刚刚提到了我所提到的,因为如果你说它是可能的,那就意味着它不再是这样了(它们甚至在标准的例子中使用它)。 – 2012-07-15 04:31:51

变量名称仅适用于编译器。它们将被转换为二进制映像中的地址。您最多可以传递3个主参数。

这里是我的尝试 -

int main(int i, char* a[], char* e[]) 

正如你所看到的名称是不正常的名字。 第一个参数是命令行参数的数量,第二个参数是实际的参数数组,第三个参数是环境变量数组。

事实上,主要可以采取任何数量的参数,但其余的,在第三后将无效。这仍然编译 -

int main(int i, char* a[], char* e[], char* j[]) 

而只是为了好玩,你甚至可以做到这一点 -

int main(int i, float a, float b, float c, float d, float e) 
+1

实际上除了'int main()'和'int main(int,char * [])'之外的所有其他'main'都不能保证工作。 – 2012-07-15 04:34:02

+0

@SethCarnegie是(说标准)!但是除非你使用DS9k,否则它会。 – 2012-07-15 04:37:13

+0

@ H2CO3我只是喜欢在标准中寻找东西。 – 2012-07-15 04:38:11

像其他人所说,这仅仅是一个方便的事项,并Kernighan和Ritchie使用这些参数中这是第一个C版本。

您可以随意使用任何东西。

这里有一个简单的例子:

#include <iostream> 

int main(int arglen, char *args[]) 
{ 
     std::cout << "Running: " << *args << std::endl; 
    while (--arglen > 0) 
     std::cout << *++args << std::endl; 
    return 0; 
} 

我使用Visual C++ 2010速成。如果你这样做,你可以按Alt + F7来带上项目属性,进入配置属性>调试,然后在Command Arguments中输入你的命令行参数。

就是这样。

+0

OP似乎误解了'arglen'和'args'对于 – 2012-07-15 05:45:56

即使是简单的main也是允许的,您仍然可以访问这些参数。

int main() 
{ 
    int nArgCount = __argc; 
    char** pArgs= __argv; 

    printf("Argument Count: %d\n", nArgCount-1); 
    printf("Arguments:"); 

    for(int nIndex = 1; nIndex<nArgCount; ++nIndex) 
     printf("%s, ", pArgs[nIndex]); 
} 

您还可以使用​​函数来访问命令行。没有/使用main的参数的重要方面是,您仍可以在任何函数中访问命令行参数

如果要读取命令行参数的值,则必须使用char *argv[]。否则你可以放弃它。

如果你只是想有一个整数来区分两件事情,那么你有一个方法来做到这一点。只需传递一个命令行参数,不要传递任何其他消息。现在你不需要char *argv[]。现在只传递一个命令行参数,那么argc的值是2,即可执行文件的名称+命令行参数。

如果您不传递命令行参数,则其值仅为1即可执行文件的名称。

+0

您的解释不清楚。你的想法更好地被[@Ajay](http://*.com/a/11490369) – 2016-02-04 00:30:37