linux中main函数参数、getopt处理命令行参数

main函数参数简介

int main(int argc, char *argv[])
argc:参数的个数,最少为一个,也就是下面示例中"./opt_parse_demo"执行程序的命令。
argv:指针数组首地址,至少放了一个指针argv[0],argv[0]指针指向的字符就是"./opt_parse_demo"。

命令行参数解析函数getopt()

##include <unistd.h>
int getopt(int argc, char * const argv[], const char *optstring);
extern char *optarg;
extern int optind, opterr, optopt;

该函数的argc和argv参数通常是直接从main()的参数直接传递而来。optstring是选项字母组成的字符串。如果该字符串里的任一字符后面又冒号,那么这个选项就要求后面带有选项参数。
getopt()所设置的全局变量包括:

  1. char *optarg:当前选项参数字符串(如果有选项参数);
  2. int optind:argv的当前索引值。当getopt()在while循环中使用时,循环结束后,剩下的字符串视为操作数,在argv[optind]至argv[argc-1]中可以找到。
  3. int opterr:这个变量非零时,getopt()函数为“无效选项”或“缺少函数参数选项”,并输出其错误信息。
  4. int optopt:当发现无效选项字符时,getopt()函数返回’?‘或’:'字符,并且optopt包含了所发现的无效选项字符。

代码示例:

#include <stdio.h>
#include <unistd.h>
int main(int argc, char  *argv[])
{
	int oc;					//选项字符
	char ec;				//无效的选项字符
	char *opt_arg;			//选项参数字符串
	while (-1 != (oc = getopt(argc, argv, "ngl:")))
	{
		switch (oc)
		{
		case 'n':
			printf("My name is Lyong.\n");
			break;
		case 'g':
			printf("Her name is Xxiong.");
			break;
		case 'l':
			opt_arg = optarg;
			printf("Our love is %s\n.", opt_arg);
			break;
		case '?':
			ec = (char)optopt;
			printf("Invalid option \'%c\' !", ec);
			break;
		case ':':
			printf("Lack option argv!", ec);
			break;
		default:
			break;
		}
	}
	return 0;
}

测试结果:

$./opt_parse_demo -a
Invalid option 'a' !
$./opt_parse_demo -n
My name is Lyong.
$./opt_parse_demo -g
Her name is Xxiong.
$./opt_parse_demo -l forever
Our love is forever.
$./opt_parse_demo -l
Lack option argv!
$./opt_parse_demo -ngl forever
My name is Lyong.
Her name is Xxiong.
Our love is forever.

Reference:
Linux程序设计——用getopt处理命令行参数

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++ main函数参数解析有两种方式:使用argc和argv,或者使用特定的命令行参数解析库。 1. 使用argc和argv: 在C++main函数参数列表通常包括两个参数:argc和argv。其argc是一个整数,表示程序运行时命令行参数的数量;argv是一个字符指针数组,表示每个参数的值。 例如,以下代码可以输出程序运行时的所有命令行参数: ```cpp #include <iostream> int main(int argc, char *argv[]) { std::cout << "argc = " << argc << std::endl; for (int i=0; i<argc; i++) { std::cout << "argv[" << i << "] = " << argv[i] << std::endl; } return 0; } ``` 2. 使用命令行参数解析库: 如果程序需要接受较为复杂的命令行参数,使用命令行参数解析库可以更方便地处理参数。常见的命令行参数解析库有Boost.Program_options、getopt和cxxopts等。 例如,以下代码使用cxxopts库解析命令行参数: ```cpp #include <iostream> #include "cxxopts.hpp" int main(int argc, char* argv[]) { cxxopts::Options options("MyProgram", " - example command line options"); options.add_options() ("f,file", "File name", cxxopts::value<std::string>()) ("n,num", "Number", cxxopts::value<int>()->default_value("10")) ("v,verbose", "Verbose output", cxxopts::value<bool>()->default_value("false")); auto result = options.parse(argc, argv); if (result.count("file")) { std::cout << "File name: " << result["file"].as<std::string>() << std::endl; } if (result.count("num")) { std::cout << "Number: " << result["num"].as<int>() << std::endl; } if (result.count("verbose")) { std::cout << "Verbose output enabled" << std::endl; } return 0; } ``` 这段代码使用cxxopts库定义了三个命令行参数:-f/--file,-n/--num和-v/--verbose,并分别指定了它们的类型和默认值。程序运行时,可以通过result对象获取这些参数的值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值