Linux 函数参数的解析 - getopt getopt_long

程序例子来自 《Linux 程序设计》

#include <unistd.h>
#include <stdio.h>

int main(int argc, char* argv[])
{
	// 全局变量
	extern char* optarg; // 选项参数
	extern int optind; // 选项下标
	extern int opterr; // 解析报错
	extern int optopt; // 选项值


	int opt = 0;
	
	while (1)
	{
		// ilr后面没:,意味着它不需要跟参数
		// 选项f紧接着:,意味着它后面必须跟参数
		opt = getopt(argc, argv, ":if:lr"); 
		if (-1 == opt)
		{
			break;
		}



		switch (opt)
		{
		case 'i':
		case 'l':
		case 'r':
			printf("option: %c\n", opt);
			break;

		case 'f':
			printf("filename: %s\n", optarg);
			break;

		case ':':
			printf("option need a value\n");
			break;
		case '?':
			printf("Unknow option type: %c\n", optopt); // 无法识别的选项
			break;
		}
	}

	// 非选项参数
	for (; optind < argc; ++optind)
	{
		printf("argument: %s\n", argv[optind]);
	}
	
	return 0;
}

 

wtz@ubuntu:~/Desktop$ ./a -i
option: i
wtz@ubuntu:~/Desktop$ ./a -ilr
option: i
option: l
option: r
wtz@ubuntu:~/Desktop$ ./a -f
option need a value
wtz@ubuntu:~/Desktop$ ./a -f a.txt
filename: a.txt
wtz@ubuntu:~/Desktop$ ./a -ilrf a.txt kj jj
option: i
option: l
option: r
filename: a.txt
argument: kj
argument: jj
wtz@ubuntu:~/Desktop$ ./a -ihl
option: i
Unknow option type: h
option: l

 

#include <unistd.h>
#include <stdio.h>
#include <getopt.h>

int main(int argc, char* argv[])
{
	extern char* optarg;
	extern int optopt;
	extern int optind;
	extern int opterr;

	int opt;
	struct option longopts[] = {
		{"init", 0, NULL, 'i'},
		{"file", 1, NULL, 'f'},
		{"list", 0, NULL, 'l'},
		{"restart", 0, NULL, 'r'},
		{0, 0, 0, 0}};

	while (1)
	{
		opt = getopt_long(argc, argv, ":if:lr", longopts, NULL);
		if (-1 == opt)
		{
			break;
		}

		switch (opt) 
		{
		case 'i':
		case 'l':
		case 'r':
			printf("option: %c\n", opt);
			break;
		case 'f':
			printf("filename: %s\n", optarg);
			break;
		case ':':
			printf("option needs a value\n");
			break;
		case '?':
			printf("unknown option: %c\n", optopt);
			break;
		}
	}

	for (; optind < argc; optind++)
	{
		printf("argument: %s\n", argv[optind]);
	}

	return 0;
}
wtz@ubuntu:~/Desktop$ ./b --init
option: i
wtz@ubuntu:~/Desktop$ ./b -i
option: i
wtz@ubuntu:~/Desktop$ ./b -ilr
option: i
option: l
option: r
wtz@ubuntu:~/Desktop$ ./b -f
option needs a value
wtz@ubuntu:~/Desktop$ ./b -f a.txt
filename: a.txt
wtz@ubuntu:~/Desktop$ ./b --file a.xt
filename: a.xt
wtz@ubuntu:~/Desktop$ ./b -h
unknown option: h
wtz@ubuntu:~/Desktop$ ./b --a
unknown option: 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值