我对这个主要功能感到非常困惑,
int main( int argc, char *argv[] ) {
/*statements*/
}
特别是
char *argv[ ].
那具体代表什么?我知道它是一个指向字符数组的指针,但是该数组是如何创建的以及它是如何工作的呢?由于字符串是数组还是字符,该字符数组是否与字符串相同?
我对这个主要功能感到非常困惑,
int main( int argc, char *argv[] ) {
/*statements*/
}
特别是
char *argv[ ].
那具体代表什么?我知道它是一个指向字符数组的指针,但是该数组是如何创建的以及它是如何工作的呢?由于字符串是数组还是字符,该字符数组是否与字符串相同?
它是一个命令行参数。您可以在程序执行期间传递一些值,如下所示。
#include<stdio.h>
int main(int count,char *argv[]){
int i=0;
for(i=0;i<count;i++)
printf("\n%s",argv[i]);
return 0;
}
//将文件保存为arg.c
在命令行中
C:\tc\bin>arg c JS
输出:
*c*
*JS*
它指向启动程序时传递给程序的参数。
例如:./a.out toto tata
printf("argv[0]: %s, argv[1]: %s, argv[2]: %s, argv[3]: %s", argv[0], argv[1], argv[2], argv[3]);
输出:
argv[0]: ./a.out , argv[1]: toto, argv[2]: tata, argv[3]: (null)
argc 是存储在 argv 中的参数数量。
您不必关心是谁创建了它,因为它是 C 标准的一部分。如果您真的想知道,请搜索有关 _start 函数的信息。
argv 是一个字符串数组,每个单独的字符串都是 char 的 selfs 数组。
有时您会看到 argv 如下所示:**argv
或argv[][]
.
char *argv[]
是 . 的语法糖char **argv
。 argv
只是一个指向以空字符结尾的字符串的指针数组。main()
在调用您的函数之前,操作系统会为您创建数组。
int argc = 运行程序时的参数个数(包括程序名)
char *argv[] = 运行程序时将参数作为“字符串”数组。这就是我的想法。
例子:
C:\> echo hello world
argc = 3
argv[0] = 回声
argv[1] = 你好
argv[2] = 世界
它指向通过执行java文件传递的参数。如果你有一个名为 MyClass 的类,它有一个 main 方法,通过调用 java myclass ab,你将在这个数组中有 a 和 b。同样在 c 或 c++ 中调用 myCommand a b...
关键的事实是它是一个指向字符的指针数组,而不是一个指向数组的指针。所以你有几个指向字符的指针,程序参数列表中的每个“单词”都有一个。
char *argv[]
char **argv
和argv[0]
to相同,argv[argvc-1]
都是指向 C 风格字符串的指针(以 NULL 结尾)。C99 标准草案实际上很好地解释了它的工作原理和内容应该是什么,从5.1.2.2.1
程序启动第2段中说:
如果它们被声明,主函数的参数应遵守以下约束:
— argc 的值应为非负数。
— argv[argc] 应为空指针。
— 如果 argc 的值大于零,则数组成员 argv[0] 到 argv[argc-1] 应包含指向字符串的指针,这些指针在程序启动之前由主机环境给出实现定义的值。目的是从托管环境中的其他地方向程序提供在程序启动之前确定的信息。如果主机环境不能提供大写和小写字母的字符串,则实现应确保以小写形式接收字符串。
— 如果 argc 的值大于零,则 argv[0] 指向的字符串代表程序名;如果程序名称在主机环境中不可用,则 argv[0][0] 应为空字符。如果 argc 的值大于 1,则 argv[1] 到 argv[argc-1] 所指向的字符串代表程序参数。
— 参数 argc 和 argv 以及 argv 数组指向的字符串应可由程序修改,并在程序启动和程序终止之间保留其最后存储的值。