小言_互联网的博客

linux C 命令行参数之getopt()函数的使用

570人阅读  评论(0)

在Linux中,Linux终端提供类的UNIX命令行环境。命令行是在命令行环境中,用户为运行程序输入命令行。在Linux用到的命令常常支持很多参数,第一个想到就是main函数命令行传参,读取在同一行附加项。

带参数的main
c编译器允许main没有参数,也可以main函数带参数。我们常见的就是main函数带两个参数(一些实现运行main函数有更多参数)。当main函数有两个参数时,第一个参数时命令行的字符串的数量。而第二个参数是把每个字符串的地址存储在指针数组中。

#include <stdio.h>

int main(int argc,char **argv)
{
	int i = 0;
    for (i = 0;i < argc;i++)
    {
        printf(" %d: %s\n",i,argv[i]);
    }

	return 0;
}

运行结果:

argc代表输入的参数个数,而argv中保存着参数具体的值。

注意:char **argv与char *argv[]等价。argv是一个指向指针的指针。

main函数读取命令行参数,把字母数字转换成整数

#include <stdio.h>
#include <stdlib.h>

int factorial(int n);

int main(int argc, char **argv)
{
		
	int num = 0;
	if (argc < 2)
	{
		printf("Usage:%s\n", argv[0]);
		return -1;
	}
	else
	{
		num = atoi(argv[1]);
		if (num > 12)
		{
			printf("Keep input under 13.\n");
			return -1;
		}
		printf("factorial of %d is %d\n",num, factorial(num));
	}


	return 0;
}


int factorial(int n)
{
	if (n <= 1)
		return 1;
	else
		return factorial(n - 1)*n;
}

运行结果:

如果运行程序时没有提供命令行参数,那么argc < 2 为真,程序将给出提示信息。如果要计算超过12!的阶乘,必须使用能表示的更大范围的类型,例如 double 或 long long。

getopt 分析命令行参数

#include <unistd.h>

int getopt(int argc, char * const argv[], const char *optstring);
extern char *optarg;
extern int opterr, optind, optopt;

返回值:
返回命令行中指定的下一个选项字符。

getopt()函数是一个命令行解析器。参数argc和argv是传递给main()的参数计数和参数数组。参数optstring是一个可识别的选项字符字符串;如果一个字符后面跟着一个<冒号>,那么该选项接受一个参数。

getopt()第三个参数optstring
指的是你支持的选项,假设你的程序支持-a,-b,-c选项,并且-c选项后面要跟具体参数,那么optstring可以是:

"abc:"
选项后面有一个冒号表示这个选项需要带参数。

getopt 的外部变量

extern char *optarg;
extern int opterr, optind, optopt;
optind 存放下一个要处理的字符串在argv数组中的下标,argv[optind];
opterr 如果选项发生错误,应用程序没有将变量opterr设置为0。
optopt 如果选项处理发生错误,它会指向导致出错的选项字符串
optarg 如果一个选项需要参数,如前面提到的c参数,由于后面有:,所以它需要参数,处理到它时,optarg会指向这个参数。
#include <stdio.h>
#include <unistd.h> //getopt

extern int optind,opterr,optopt;
extern char *optarg;

int main(int argc,char **argv)
{

	int c = 0;

	while(EOF != (c = getopt(argc,argv,"abc:")))
	{
		switch(c)
		{
			case 'a':
				printf("option a:\n");
				break;

			case 'b':
				printf("option b:\n");
				break;
            case 'c':
                printf("we get option -n,para is %s\n",optarg); //由于c后面有:,必须要有参数,optarg会指向这个参数。
                break;     
            case '?':
                printf("unknow option:%c\n",optopt);//表示选项不支持
                break;
            default:
                break;	

		}
	}

	return 0;
}

输入正常选项时,我们可以看到能正确获取到选项,如果不是,则提示无效的操作。


转载:https://blog.csdn.net/chen1415886044/article/details/102404995
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场