C处理命令行参数示例

[size=medium]问题:如何处理如下的命令行参数[/size]
sign file1 [file2 file3 ...] [-o output] [-k key]

至少提供一个文件供程序处理,可选择提供-o, -k选项,一旦提供,必须提供对应参数

[size=medium]基本思路是利用getopt函数解析argv[/size]
[size=medium]头文件:[/size]#include
[size=medium]函数声明:[/size]int getopt(int argc, char * const argv[], const char *optstring);
例如optsring="ab:c::"
表示-a不加参数, -b必须代参数 -c可选是否带参数
[size=medium]getopt() 所设置的全局变量包括[/size]:
optarg——指向当前选项参数(如果有)的指针。
optind——再次调用 getopt() 时的下一个 argv 指针的索引。
GNU的getopt会对argv排序,其余参数在argv[optwind]与argv[argc-1]之间。
optopt——最后一个已知选项。

#include 
#include

int main(int argc, char *argv[]) {
//解析命令行参数
int ret, num_file,i;
char *privkey_file = "privkey.pem", *sig_file="sig";
//循环处理所有参数
while ((ret = getopt(argc, argv, "o:k:")) != -1) {
switch (ret) {
case ('o'):
sig_file = optarg;
break;
case ('k'):
privkey_file = optarg;
break;
case ':':
// 缺少选项参数
case '?':
default:
// 无效选项
fprintf(stderr, "%s: option '-%c' is invalid: ignored\n", argv[0],
optopt);
fprintf(stderr,"usage: sign file1 [file2 file3 ...] [-o signature] [-k private_key_file]\n");
fprintf(stderr,"NOTE:default signature output file: sig\n");
fprintf(stderr,"NOTE:default private key file: privkey.pem\n");
exit(1);
break;
}
}
//计算其他参数
num_file=argc-optind;
if(num_file<1){//无文件可处理
fprintf(stderr,"NO file to sign, exiting...");
exit(1);
}
//显示其他参数
for (i=0; i < num_file; i++) {
printf("file %d to sign: %s\n",i+1, argv[i+optind]);
}
printf("private key file: %s\n", privkey_file);
printf("output signature file: %s\n", sig_file);
return 0;
}


输入:
$ ./arg file1 file2 -o ooo -k kk

结果:
file 1 to sign: file1
file 2 to sign: file2
private key file: kk
output signature file: ooo



PS:
[size=medium]main函数的argc至少为1,如果为1,说明程序名后不带命令行参数
argv[0]是启动该程序的程序名
argv[argc]为空指针[/size]
例如:
echo hello

的argv[0]="echo", argv[1]="hello", arg[2]=null

你可能感兴趣的:(C,C++,C#)