101

可能的重复:
main() 的参数是什么?
int argc, char *argv[] 是什么意思?

每个程序都是从main(int argc, char *argv[])定义开始的。

我不明白这是什么意思。如果有人能解释为什么我们在程序中不使用这些参数,我会很高兴?为什么不只是:int main()

程序的名称是 的元素之一,*argv[]并且argc是 中的参数数量的计数*argv[]吗?发送到的其他参数是*argv[]什么?我们如何发送它们?

4

8 回答 8

125

参数argcargvofmain用作向程序发送参数的一种方式,可能最熟悉的方式是使用用户可以键入的良好终端cat file。这里的单词cat是一个程序,它获取一个文件并将其输出到标准输出 ( stdout)。

程序接收参数的数量和参数argc的向量argv,在上面的参数计数将是两个程序名称计为第一个参数)并且参数向量将包含 [ , , null ]。而最后一个元素是空指针。catfile

通常,你会这样写:

int  // Specifies that type of variable the function returns.
     // main() must return an integer
main ( int argc, char **argv ) {
     // code
     return 0; // Indicates that everything went well.
}

如果您的程序不需要任何参数,main则以以下方式编写 -function 同样有效:

int main() {
  // code
  return 0; // Zero indicates success, while any 
  // Non-Zero value indicates a failure/error
}

在 C 语言的早期版本中,以前没有intmain因为这是暗示的。今天,这被认为是一个错误。

在符合POSIX的系统(和 Windows)上,可以使用第三个参数char **envp,其中包含程序环境变量的向量。存在函数参数列表的进一步变体main,但我不会在这里详细说明,因为它是非标准的。

此外,变量的命名是一种约定,没有实际意义。坚持这一点总是一个好主意,这样你就不会混淆其他人,但定义main

int main(int c, char **v, char **e) {
   // code
   return 0;
}

And for your second question, there are several ways to send arguments to a program. I would recommend you to look at the exec*()family of functions which is POSIX-standard, but it is probably easier to just use system("command arg1 arg2"), but the use of system() is usually frowned upon as it is not guaranteed to work on every system. I have not tested it myself; but if there is no bash,zsh, or other shell installed on a *NIX-system, system() will fail.

于 2010-10-09T22:09:35.697 回答
67

这些用于在调用程序时将参数传递给您的程序,例如从命令行

$ gcc mysort.c -o mysort

$ mysort 2 8 9 1 4 5

上面,程序mysort使用一些命令行参数执行。在里面main( int argc, char * argv[]),这将导致

Argument Count, argc = 7 

因为有 7 个参数(计算程序),并且

Argument Vector, argv[] = { "mysort", "2", "8", "9", "1", "4", "5" };

下面是一个完整的例子。

$ cat mysort.c
#include <stdio.h>
int main( int argc, char * argv [] ) {
    printf( "argc = %d\n", argc );
    for( int i = 0; i < argc; ++i ) {
        printf( "argv[ %d ] = %s\n", i, argv[ i ] );
    }
}

$ gcc mysort.c -o mysort

$ ./mysort 2 8 9 1 4 5
argc = 7
argv[ 0 ] = ./mysort
argv[ 1 ] = 2
argv[ 2 ] = 8
argv[ 3 ] = 9
argv[ 4 ] = 1
argv[ 5 ] = 4
argv[ 6 ] = 5

[char字符串“2”、“8”等可以使用一些字符到数字的转换函数转换为数字,例如atol() (链接)]

于 2010-10-09T21:58:40.827 回答
16

使用argc(argument count) 和argv(argument vector) 您可以在启动应用程序时获取传递的参数的数量和值。

这样,当您的应用程序启动时,您可以使用参数(例如-version)以不同的方式运行。

但是您也可以int main(void)在 C 中用作原型。

还有第三个(鲜为人知且非标准的)原型,其第三个参数是envp. 它包含环境变量。


资源:

于 2010-10-09T21:56:30.237 回答
3

argc表示传递给程序的参数数量。char* argv[]是传递的参数。argv[0]始终是程序名称本身。我不是 100% 确定,但我认为int main()在 C/C++ 中有效。

于 2010-10-09T21:57:29.987 回答
1

argc是在运行时提供给程序的命令行参数的数量,并且argv是包含这些参数的字符数组(而不是 C 字符串数组)。如果你知道你不需要命令行参数,你可以在接受void参数时声明你的 main,而不是:

int main(void) {
    /* ... */ 
}

这些是根据标准定义的仅有的两个原型main,但一些编译器也允许返回类型void为。更多关于这在维基百科

于 2010-10-09T21:59:15.957 回答
1

comp.lang.c FAQ处理这个问题

“main() 的正确声明是什么?”
问题 11.12a中。

于 2010-10-09T22:06:51.773 回答
0

argc是命令行参数的数量,argv是表示命令行参数的字符串数组。

这使您可以选择对传递给程序的参数做出反应。如果你不期待,你不妨使用int main.

于 2010-10-09T21:55:49.880 回答
0

您可以使用诸如app -something -somethingelse. int argc表示这些参数的数量,并且char *argv[]是一个数组,其中包含传递到您的应用程序的实际参数。这样您就可以在应用程序中使用它们。

于 2010-10-09T21:59:59.760 回答