C处理命令行参数示例

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

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

[size=medium]基本思路是利用getopt函数解析argv[/size]
[size=medium]头文件:[/size]#include <unistd.h>
[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 <getopt.h>
#include <stdio.h>

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值