未指定-n/-s参数值时,getopt中optarg的取值问题
getopt缺失必填参数时optarg的值是什么?
问题描述
我有如下代码,用getopt处理命令行参数:
int opt; while ((opt = getopt(_argc, _argv, "n:pcs:")) != -1) { switch (opt) { case 'n': *_numberOfMessages = atoi(optarg); break; case 'p': if(*_consumereFlag) { return ERROR; } *_producerFlag = ON; break; case 'c': if(*_producerFlag) { return ERROR; } *_consumereFlag = ON; break; case 's': *_delayTimemSec = atoi(optarg); break; default: return ERROR; } } return 0;
这段代码通过getopt获取用户传入的命令行参数,将参数值存入optarg。当在-n或-s后传入参数时运行正常,但如果仅输入-n而不跟随任何参数,此时optarg的值是什么?
回答
当你使用getopt处理带必填参数的选项(比如你的n:和s:,冒号表示选项需要参数),但用户只输入选项名却不提供参数时:
getopt会将opt的值设为'?',此时**optarg的值是NULL**。- 默认情况下,
getopt还会向标准错误流(stderr)打印一条错误提示,比如:option requires an argument -- 'n'。
另外补充两个实用细节:
- 如果你不想让
getopt输出错误信息,可以提前设置opterr = 0;,但此时opt仍然会是'?',optarg依旧为NULL。 - 在你的代码里,这种情况会直接进入
default分支返回ERROR,反而避免了潜在的崩溃风险——毕竟atoi(NULL)属于未定义行为,还好代码没走到那一步。
内容的提问来源于stack exchange,提问作者Ron
相关产品推荐
相关产品推荐

