gpt4 book ai didi

c - getopt 没有正确处理错误

转载 作者:太空宇宙 更新时间:2023-11-04 07:08:52 25 4
gpt4 key购买 nike

您好,我想在我的程序中使用 getopt。到目前为止它适用于正确的输入,但是当我以错误的方式使用提要时,它会打印:option requires an argument -- 's' 之后我得到一个段错误:

while((args = getopt(argc, argv, "ehs:")) != -1){
switch (args) {
case 'e':
if (options.opts[0] == 1)
error_exit(USAGE_ERROR, "option multiple times");
else
options.opts[0] = 1;
break;
case 'h':
if (options.opts[1] == 1)
error_exit(USAGE_ERROR, "option multiple times");
else
options.opts[1] = 1;
break;
case 's':
if (options.opts[2] == 2)
error_exit(USAGE_ERROR, "option multiple times");
else
options.opts[2] = 2;
char *saveptr;
if((options.word = strtok_r(optarg, ":", &saveptr)) == NULL)
error_exit(USAGE_ERROR, "WORD MISSING");
if((options.tag = strtok_r(NULL, ":", &saveptr)) == NULL)
error_exit(USAGE_ERROR, "TAG MISSING");
char *temp = NULL;
if((temp = strtok_r(NULL, ":", &saveptr)))
error_exit(USAGE_ERROR, "WORD and TAG already set!");
break;
case '?': //Never enters this case or default. WHY???
default:
error_exit(USAGE_ERROR, "");
break;
}
}

我希望你能帮我解决这个问题。

如果需要,这是我的 Opt 结构:

typedef struct Opt
{
int opts[3]; // e h s
char *word,
*tag;
} Opt;

最佳答案

请了解如何创建 MCVE ( How to create a Minimal, Complete, and Verifiable Example? ) 或SSCCE ( Short, Self-Contained, Correct Example ) — 相同基本思想的两个名称和链接。

user3629249在他的 answer ,我根据你的展示做了一个测试程序,没找到问题。

测试代码(goc.c)

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

typedef struct Opt
{
int opts[3]; // e h s
char *word,
*tag;
} Opt;

enum E_Numbers { USAGE_ERROR };

static void error_exit(enum E_Numbers e, const char *tag)
{
fprintf(stderr, "%d: %s\n", e, tag);
exit(EXIT_FAILURE);
}

int main(int argc, char **argv)
{
Opt options = { { 0 }, 0, 0 };
int args;
while((args = getopt(argc, argv, "ehs:")) != -1){
switch (args) {
case 'e':
if (options.opts[0] == 1)
error_exit(USAGE_ERROR, "option multiple times");
else
options.opts[0] = 1;
break;
case 'h':
if (options.opts[1] == 1)
error_exit(USAGE_ERROR, "option multiple times");
else
options.opts[1] = 1;
break;
case 's':
if (options.opts[2] == 2)
error_exit(USAGE_ERROR, "option multiple times");
else
options.opts[2] = 2;
char *saveptr;
if((options.word = strtok_r(optarg, ":", &saveptr)) == NULL)
error_exit(USAGE_ERROR, "WORD MISSING");
if((options.tag = strtok_r(NULL, ":", &saveptr)) == NULL)
error_exit(USAGE_ERROR, "TAG MISSING");
char *temp = NULL;
if((temp = strtok_r(NULL, ":", &saveptr)))
error_exit(USAGE_ERROR, "WORD and TAG already set!");
break;
case '?': //Never enters this case or default. WHY???
default:
error_exit(USAGE_ERROR, "Unexpected option");
break;
}
}

printf("e = %d, h = %d, s = %d\n", options.opts[0], options.opts[1], options.opts[2]);
printf("word = <<%s>>\n", options.word ? options.word : "NULL");
printf("tag = <<%s>>\n", options.tag ? options.tag : "NULL");

return 0;
}

在循环主体中所做的唯一更改是将消息 “Unexpected option” 添加到 default 中对 error_exit() 的调用: (和 case '?':)代码。

示例运行

$ ./goc
e = 0, h = 0, s = 0
word = <<NULL>>
tag = <<NULL>>
$ ./goc -h -e
e = 1, h = 1, s = 0
word = <<NULL>>
tag = <<NULL>>
$ ./goc -h -e -s abc:def
e = 1, h = 1, s = 2
word = <<abc>>
tag = <<def>>
$ ./goc -h -e -s abc
0: TAG MISSING
$ ./goc -h -e -s abc:def:
e = 1, h = 1, s = 2
word = <<abc>>
tag = <<def>>
$ ./goc -h -e -s abc:def:ghi
0: WORD and TAG already set!
$ ./goc -h -f -s abc:def:ghi
$ ./goc: illegal option -- f
0: Unexpected option
$ ./goc -a -b -c -d -e -f -h -e
./goc: illegal option -- a
0: Unexpected option
$ ./goc -s
./goc: option requires an argument -- s
0: Unexpected option
$ ./goc -s --
0: TAG MISSING
$ ./goc -s --:--
e = 0, h = 0, s = 2
word = <<-->>
tag = <<-->>
$ ./goc -s -- # Note this one!
0: TAG MISSING
$ ./goc -s --:
0: TAG MISSING
$ ./goc -s --:--
e = 0, h = 0, s = 2
word = <<-->>
tag = <<-->>
$ ./goc -s --::--
e = 0, h = 0, s = 2
word = <<-->>
tag = <<-->>
$ ./goc -s --::--::
e = 0, h = 0, s = 2
word = <<-->>
tag = <<-->>
$ ./goc -s --::--::--
0: WORD and TAG already set!
$

因为 error_exit() 函数实际上退出了,所以我不会在单次运行中收到多个错误报告;第一个是致命的。

没有崩溃;没有意外的行为。我认为你的问题在别处。

根据记录,测试是在 Mac OS X 10.10.3 上使用 GCC 5.1.0 和 Apple 在该平台上提供的标准 getopt() 执行的。但是,我希望在 Linux 以及我使用过的所有 Unix 平台上也有相同的行为。

关于c - getopt 没有正确处理错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30018615/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com