gpt4 book ai didi

解析(选项)参数的正确方法,有关 getopt(3) 和 argv 的问题

转载 作者:行者123 更新时间:2023-11-30 15:43:03 25 4
gpt4 key购买 nike

作为一个例子,我想实现以下功能:列表工具 [-s | -a NUM] <字符串>

我的方法如下:

int opt;
int opt_s = -1, opt_a = -1, num;
char *optstr ="<not yet set>";
num = -1;

if( argc < 3 || argc > 4 ) {
fprintf(stderr, "Wrong number of arguments");
usage();
}

/* Options */
while ((opt = getopt(argc, argv, "sa:")) != -1) {
switch (opt) {
case 's': {
if (opt_s != -1) {
fprintf(stderr, "opt_s multiple times\n");
usage(); /* does not return */
}
else if (opt_a != -1) {
fprintf(stderr, "Please only choose one option\n");
usage();
}
else {
++opt_s;
break;
}
}
case 'a': {
if (opt_a != -1) {
fprintf(stderr, "opt_a multiple times\n");
usage(); /* does not return */
}
else if (opt_s != -1) {
fprintf(stderr, "Please only choose one option\n");
usage();
}
++opt_a;
++num;
break;
}
case '?': {
usage();
break;
}
// Impossible
default: {
assert(0);
}
}
}

/* Arguments */
if( num > -1 ) {
if( (argc - optind) != 2 ) {
usage();
}
num = (int)strtol( argv[optind], NULL, 0 );
*optstr = argv[optind+1];
}
else {
if( (argc - optind) != 1 ) {
usage();
}
*optstr = argv[optind];
}

这段代码有一些地方不起作用。我想知道为什么,以及执行此操作的正确方法是什么。

  • 首先,getopt 尝试解析参数,然后进入 ?案例
  • (optind - argc) 未抛出正确数量的参数
  • 将 argv[optind] 赋值给 optstr 会抛出:

    警告:赋值从指针生成整数,无需强制转换

提前感谢您的每一个回答

最佳答案

第三个问题的答案将argv[optind]分配给optstr会抛出:警告?如下,

char *optstr; 
*optstr = argv[optind]; // Wrong if LHS is a string rather a char


optstr = argv[optind]; // Correct one

这里,optstr是一个指向字符的指针,可以存储单个字符或字符串。另外,*optstr 指的是 char,RHS argv[optind] 是指指针的字符串。因此发出警告。

关于解析(选项)参数的正确方法,有关 getopt(3) 和 argv 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19961312/

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