每个程序都从 main(int argc, char *argv[])
定义开始。
我不明白这是什么意思。如果我们在程序中没有使用这些参数,为什么要使用它们?为什么不只用 int main()
?
程序名称是否是 *argv[]
的一个元素,而 argc
是 *argv[]
中参数数量的计数?其他发送到 *argv[]
的参数是什么?我们如何发送它们?
每个程序都从 main(int argc, char *argv[])
定义开始。
我不明白这是什么意思。如果我们在程序中没有使用这些参数,为什么要使用它们?为什么不只用 int main()
?
程序名称是否是 *argv[]
的一个元素,而 argc
是 *argv[]
中参数数量的计数?其他发送到 *argv[]
的参数是什么?我们如何发送它们?
main
函数的参数argc
和argv
用于向程序传递参数,最常见的方式是使用老旧的终端,用户可以键入cat file
。在这里,单词cat
是一个程序,它将文件输出到标准输出(stdout
)。
程序接收argc
中的参数数量和argv
参数列表。在上面的例子中,argument count将是两个(程序名称计为第一个参数),而argument vector将包含[cat
,file
,null],其中最后一个元素是空指针。
通常,您会像这样编写:
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
函数同样是合法的:
int main() {
// code
return 0; // Zero indicates success, while any
// Non-Zero value indicates a failure/error
}
在 C 语言的早期版本中,在 main
之前没有 int
这个关键字,因为这是默认的。但是在今天,这种写法已经被认为是错误的。char **envp
的第三个参数,其中包含程序的 环境变量 向量。还有其他变体的 main
函数参数列表,但我不会在此详细介绍,因为这是非标准的。main
为其他名称也是合法的。int main(int c, char **v, char **e) {
// code
return 0;
}
至于您的第二个问题,有几种方法可以向程序发送参数。我建议您查看exec*()
函数族,这是POSIX标准,但可能使用system
("command arg1 arg2")
更容易,但通常不建议使用system()
,因为它不能保证在每个系统上都能正常工作。我没有亲自测试过;但如果*NIX系统上没有安装bash
、zsh
或其他shell,system()
将失败。
argc
的最小可能值为1,argv [0]
包含字符串 ./mymainprogram
而 argv [1]
是 NULL
。我的问题是: 1: argc
可以容纳的最大值是多少? 2: 添加到 argv[]
中的这些字符串是什么? - phougatvargc
的实际限制为16K。 - Jesse Chisholm这些是用于向您的程序传递参数的,例如从命令行调用程序时。
$ 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
使用一些字符到数字的转换函数,例如atol()
(链接在这里),可以将char
字符串"2"、"8"等转换为数字。
使用 argc
(参数计数)和 argv
(参数向量),您可以在应用程序启动时获取传递的参数数量和值。
这样一来,当启动您的应用程序时,您就可以使用参数(如-version
)以不同的方式进行操作。
但是,在C中,您也可以将 int main(void)
作为原型。
第三个原型(较少知道和非标准的)具有第三个参数,即 envp
,其中包含环境变量。
资源:
argc
表示传递给程序的参数数量。 char* argv[]
是传递的参数。 argv[0]
总是程序本身的名称。 我不是100%确定,但我认为在C / C ++中 int main()
是有效的。
int main()
只在 C++ 中有效。在 C 中,您需要像这样放置一个 void:int main(void)
。C 风格的 int main(void)
在 C++ 中也是有效的,尽管在 C++ 中不鼓励使用它。 - Ultimaterint main()
在C语言中也是有效的。它声明了一个变参函数。 - Navinint main()
和int main(void)
都可以编译通过,但是一个C编译器,特别是旧的C编译器,不支持C++风格的int main()
。我上过一门关于C/C++的课程,强调了可移植性,如果你的作业应该用C语言编写,而你给出了int main()
声明,他的作业检查器会抱怨,甚至无法编译,除非我们在截止日期前重新提交,否则我们会失去作业分数。 - Ultimaterargc
是程序在运行时接收到的命令行参数的数量,而 argv
则是一个字符数组的数组(更确切地说,是 C 字符串的数组),其中包含这些参数。如果您知道自己不需要命令行参数,则可以将主函数声明为接受 void
参数:
int main(void) {
/* ... */
}
根据标准,这是main
定义的唯二原型,但有些编译器也允许返回类型为void
。更多信息请参见维基百科。
int main()
是一个可以接受任意多个参数的函数,而 int main(void)
则不接受任何参数,因此后者更为正确。 - Youint main()
是一个不带参数的函数。在一个不是定义的声明中,它是一个带有未指定参数的函数。这是n1256中的6.7.5.3/14,或者n794中的6.5.5.3/10。提问者正在询问一个定义。 - Steve Jessopcomp.lang.c FAQ 讨论了 问题11.12a 中关于
"main() 的正确声明是什么?"的问题。
argc
是命令行参数的数量,argv
是表示命令行参数的字符串数组。
这使您有机会对传递给程序的参数做出反应。如果您不期望任何参数,则可以使用 int main
。
您可以使用参数运行应用程序,例如app -something -somethingelse
。int argc
表示这些参数的数量,char *argv[]
是一个包含传递给应用程序的实际参数的数组。这样,您就可以在应用程序内部处理它们。
int main(void)
或int main()
是完全允许的(也很明智)。在C99或C11中,返回类型(int
)是强制性的;如果您没有指定代码遵循哪个版本的C标准,编译器有时仍然可以让您省略它。另请参见在C和C++中main()
应该返回什么?。 - Jonathan Leffler