是否必须编写int main(int argc,char * argv []),不能使用其他名称而不是argc和* argv []?

时间:2012-07-15 04:18:08

标签: c visual-c++ command-line-arguments

我在这里遇到一些麻烦,在项目选项本身中给Visual Studio提供命令行参数(在'配置属性' - >'调试'中)。

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

您能否仅仅向我提供一个我需要在MSVS C ++ Property Pages的命令行参数空间中输入的简单示例?我根本找不到任何关于如何将命令行参数提供给MSVS的示例。

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

6 个答案:

答案 0 :(得分:9)

如果您希望程序理解单个整数命令行参数,则仍然必须使用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

答案 1 :(得分:5)

名称只是一个完善的约定,你可以使用你想要的任何名称(虽然它可能会引起一些人的注意),但是,我只看到使用两者的代码指定顺序的参数。

在ANSI之前的日子里,可能只有int main(),但它仍然是..但是这些天通常会提供argc argv

您无法提供其中一个参数。

答案 2 :(得分:4)

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

这是我试过的 -

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

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

实际上,main可以接受任意数量的参数,但其余的,在第三个之后将是无效的。这仍然可以编译 -

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

只是为了好玩,你甚至可以这样做 -

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

答案 3 :(得分:4)

即使是简单的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]);
}

您还可以使用GetCommandLine功能访问命令行。没有/使用main参数的重要方面是你仍然可以访问任何函数中的命令行参数

答案 4 :(得分:1)

与其他提到的一样,这只是一个方便的问题,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 Express。如果这样做,您可以按Alt + F7以显示项目属性,转到配置属性&gt;在Command Arguments中调试并输入命令行参数。

就是这样。

答案 5 :(得分:1)

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

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

如果你没有传递命令行参数,那么它的值只有1,即可执行文件的名称。