命令行参数
在图形界面普及之前都使用命令行界面。DOS和UNIX就是例子。Linux终端提供类UNIX命令行环境。
命令行(command line)是在命令行环境中,用户为运行程序输入命令的行。命令行参数(command-line argument)是同一行的附加项。
例如:
demo.exe hello world
C语言程序可以读取并使用这些附加项,如下图:
下面是一个典型例子:通过main的参数来读取这些附加项。
#include <stdio.h>
int main(int argc, char *argv[]) {
int count;
printf("count of arg: %d\n", argc - 1);
for (count = 1; count < argc; ++count) {
printf("%d: %s\n", count, argv[count]);
}
printf("\n");
return 1;
}
将程序编译成可执行文件,并运行:
说明:
C编译器允许main()
没有参数或者有两个参数(一些实现允许main()
拥有更多参数,属于对标准的扩展)。main
函数有两个参数时,第一个参数是命令行中字符串数量。(过去,这个int
类型参数被称为argc
)。系统用空格表示一个字符串的结束和下一个字符串的开始。
上面demo示例中包括命令名一共有三个字符串,其中两个供demo示例使用。
该程序把命令行字符串存储在内存中,并把每个字符串的地址存储在指针数组中,该数组的地址被存储在main()
的第二个参数中,这个指向指针的指针成为argv
(表示参数值)。
如果系统允许(一些操作系统不允许这样),就把程序本身的名称赋给argv[0]
,然后把随后的第1个字符串赋给argv[1]
,以此类推。
在我们的例子中,有下面的关系:
argv[0] 指向 c_demo2.exe
argv[1] 指向 hello
argv[2] 指向 world
main()
中形参形式与其他带形参的函数相同,许多程序员用不同的形式声明argv
:
char **argv
与char *argv[]
等价,因为argv
是一个指向指针的指针。
int main(int argc, char **argv)
顺带一提,许多环境(包括UNIX和DOS)都允许用双引号把多个单词括起来形成一个参数。例如:
c_demo2.exe "hello world" abc
这行命令行参数把字符串"hello world"
复制给argv[1]
, abc
赋值给argv[2]
。