5

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

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

您能否提供一个简单的示例来说明我需要在 MSVS C++ 属性页的命令行参数空间中输入的内容?我根本找不到任何关于如何将命令行参数提供给 MSVS 的示例。

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

4

6 回答 6

11

如果您希望您的程序理解单个整数命令行参数,您仍然必须使用argcand argv。这样的事情应该这样做:

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 *[]). 您可以随意命名参数,但它们几乎总是被称为argcand argv

于 2012-07-15T04:20:48.390 回答
6

这些名称只是一个公认的约定,您可以使用任何您想要的名称(尽管它可能会引起一些人的注意),但是,我只看到了按指定顺序使用这两个参数的代码。

在 ANSI 之前的日子里,可以简单地拥有int main(),现在仍然是 .. 但这些日子argc argv通常是提供的。

您不能只提供参数之一。

于 2012-07-15T04:20:42.323 回答
5

变量名称仅供编译器使用。它们将被转换为二进制映像中的地址。您最多可以为 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)
于 2012-07-15T04:29:10.590 回答
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' 参数的重要方面是您仍然可以在任何函数中访问命令行参数

于 2012-07-15T07:55:00.710 回答
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 调出项目属性,转到配置属性 > 调试并在Command Arguments.

就是这样。

于 2012-07-15T05:38:10.213 回答
1

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

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

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

于 2012-07-15T08:12:26.267 回答