C 解析'';在getopt
这段代码编译得很好,但当我像这样运行它时:C 解析'';在getopt,c,C,这段代码编译得很好,但当我像这样运行它时: void display(char * str){ printf("%s: Missing file\n", str); } int main(int argc, char **argv) { int longIndex, opt = 0; const char *optString = "h?"; static const struct option longOpts[] = { { "help", no_
void display(char * str){
printf("%s: Missing file\n", str);
}
int main(int argc, char **argv)
{
int longIndex, opt = 0;
const char *optString = "h?";
static const struct option longOpts[] = {
{ "help", no_argument, NULL, 'h' },
{ NULL, no_argument, NULL, 0 }
};
opt = getopt_long( argc, argv, optString, longOpts, &longIndex );
while( opt != -1 ) {
switch( opt ) {
case 'h':
case '?':
display(argv[0]);
break;
default:
break;
}
opt = getopt_long( argc, argv, optString, longOpts, &longIndex );
}
return 0;
}
它不调用display。我遗漏了什么?当它找到一个不在optstring中的参数,或者如果它检测到一个缺少的选项参数,那么你不应该在optstring中使用“?”问号,因为它有点保留,相反,你应该使用更传统的“h”来帮助别人 见 编辑: 这是一个例子:
./a.out ?
常量字符*optString=“h?”
上面的行替换为下面的行
常量字符*optString=“h\?”
这是C语言中问号的字面意思如果包括-?在帮助消息中使用--help,在调用getopt时不使用问号,在case选项中不使用问号,并确保--help是列表中的第一个case选项,问号按您的意愿工作。如何显示“?”的消息?我的意思是您不应该将其用作optstring的一部分,因为getopt会在a)看到未知选项b)缺少arg c)看到“?”字符时返回“?”,但您当然可以在开关情况下使用它。您缺少-。所有选项都以-?这不是一种选择。(实际上,它是一个shell元字符,将匹配任何单个字符的文件名,因此它可能根本不会传递给您的程序。请尝试。/a.out-?(请注意getopt返回的关于?的其他注释)。
switch (opt) {
case 'n':
some_flag = 1;
break;
case 'h': /* help */
default: /* '?' unknown opt or missing arg*/
fprintf(stderr, "Usage: %s [-n nsecs] \n", argv[0]);
exit(EXIT_FAILURE);
}