履行程序时,能够从命令行传值给 C 程序。这些值被称为命令行参数,它们对程序很重要,特别是当您想从外部控制程序,而不是在代码内对这些值进行硬编码时,就显得尤为重要了。
命令行参数是运用 main() 函数参数来处理的,其中,argc 是指传入参数的个数,argv[] 是一个指针数组,指向传递给程序的每个参数。下面是一个简单的实例,查看命令行是否有供给参数,并依据参数履行相应的动作:
#include <stdio.h>
int main( int argc, char *argv[] )
{
if( argc == 2 )
{
printf("The argument supplied is %s\n", argv[1]);
}
else if( argc > 2 )
{
printf("Too many arguments supplied.\n");
}
else
{
printf("One argument expected.\n");
}
}
运用一个参数,编译并履行上面的代码,它会发生下列成果:
$./a.out testing
The argument supplied is testing
运用两个参数,编译并履行上面的代码,它会发生下列成果:
$./a.out testing1 testing2
Too many arguments supplied.
不传任何参数,编译并履行上面的代码,它会发生下列成果:
$./a.out
One argument expected
应当指出的是,argv[0] 存储程序的名称,argv[1] 是一个指向第一个命令行参数的指针,*argv[n] 是最终一个参数。假如没有供给任何参数,argc 将为 1,不然,假如传递了一个参数,argc 将被设置为 2。
多个命令行参数之间用空格分隔,可是假如参数本身带有空格,那么传递参数的时候应把参数放置在双引号 “” 或单引号 ” 内部。让咱们从头编写上面的实例,有一个空间,那么你能够经过这样的观点,把它们放在双引号或单引号””””。让咱们从头编写上面的实例,向程序传递一个放置在双引号内部的命令行参数:
#include <stdio.h>
int main( int argc, char *argv[] )
{
printf("Program name %s\n", argv[0]);
if( argc == 2 )
{
printf("The argument supplied is %s\n", argv[1]);
}
else if( argc > 2 )
{
printf("Too many arguments supplied.\n");
}
else
{
printf("One argument expected.\n");
}
}
运用一个用空格分隔的简单参数,参数括在双引号中,编译并履行上面的代码,它会发生下列成果:
$./a.out "testing1 testing2"
Progranm name ./a.out
The argument supplied is testing1 testing2
main 的两个参数的参数名如下:
int main( int argc, char *argv[] )
并不一定这样写,只是约定俗成算了。可是亦能够写成下面这样:
int main( int test_argc, char *test_argv[] )
任意你喜爱的名字。
可是大部分人还是写成开头那样的,如下:
int main( int argc, char *argv[] )
Linux 下咱们可运用 getopt 和 getopt_long 来对命令行参数进行解析,例如:
int main(int argc, char *argv[]){
char *optstr = "p:n:m:c:";
struct option opts[] = {
{"path", 1, NULL, 'p'},
{"name", 1, NULL, 'n'},
{"mtime", 1, NULL, 'm'},
{"ctime", 1, NULL, 'c'},
{0, 0, 0, 0},
};
int opt;
while((opt = getopt_long(argc, argv, optstr, opts, NULL)) != -1){
switch(opt) {
case 'p':
strcpy(path, optarg);
break;
case 'n':
strcpy(targetname, optarg);
break;
case 'm':
modifiedtime = atoi(optarg);
break;
case 'c':
changetime = atoi(optarg);
break;
case '?':
if(strchr(optstr, optopt) == NULL){
fprintf(stderr, "unknown option '-%c'\n", optopt);
}else{
fprintf(stderr, "option requires an argument '-%c'\n", optopt);
}
return 1;
}
}
findInDir(path);
return 0;
}