gpt4 book ai didi

c - 多个逗号分隔值的 getopt 错误处理

转载 作者:太空宇宙 更新时间:2023-11-04 03:22:51 32 4
gpt4 key购买 nike

如何针对从 getopt 命令行接收到的逗号分隔值的多个组合验证字符串变量?

       case 'a' :
flaga=1;
alg = optarg;
printf("you entered option -a \"%s\"\n", optarg);

if(strcmp(alg,"lr") == 0 )
{
....//valid
}
else if(strcmp(alg,"lda") == 0 )
{
....//valid
}
else if(strcmp(alg,"knn") == 0 )
{
...//valid
}
"""""
""""
else
{
printf("wrong value entered for option -a \n");
exit();
}

选项 -a 可以接受这些值:"knn","lda","lr","kart","nb","svm"。

如果用户只传递单个值,上面的代码可以完美地处理错误。

但是选项 -a 可以接受以逗号分隔的多个值,

                    Eg :   -a knn,lr,lda

用户可以以任意值的任意组合传递这些值!!

                    Eg :   -a knn,lr,lda
Eg : -a knn,lda.lr
Eg : -a lda,lr

如何检查用户是否为选项 -a 传递了有效值?

我编写的上述代码包含在 switch case 中,如果只传递选项 -a 的单个值,则可以处理。

最佳答案

当您允许使用逗号分隔的多个选项时,您必须在逗号处拆分字符串并处理每个标记。拆分字符串的一种方法是库函数 strtok来自 <string.h> .比较它们时,请注意从标记中删除空格。

另一个问题是您希望如何表示结果。一种方法是用适当的选项填充最初归零的选项数组。另一种方法是使用位组合,使选项 0,1 和 3 对应于 2⁰ + 2¹ + 2³ = 1 + 2 + 8 = 11。这就是我在下面使用的方法。

下面的示例程序提供了一个函数 multi_opt解析由逗号分隔的选项列表。当输入未知选项时,程序会立即退出。您可以选择返回无效的位组合,并将错误处理的责任传递给调用代码。

该函数在参数字符串为空时也有效,在这种情况下没有设置任何选项。 main函数显示了如何使用该函数..

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

/*
* Return index of str in opt or -1 if it can't be found.
*/
int find_opt(const char *str, const char **opt)
{
int i;

for (i = 0; opt[i];i++) {
if (strcmp(str, opt[i]) == 0) return i;
}

return -1;
}

/*
* Return a bit combination of the options from opt found in str.
*/
unsigned int multi_opt(const char *str, const char **opt)
{
unsigned int res = 0u;
char buf[strlen(str) + 1];
char *p = buf;

// copy to modifiable buffer and strip whitespace
while (*str) {
if (!isspace((unsigned char) *str)) *p++ = *str;
str++;
}

*p= '\0';

// split string and process tokens
p = strtok(buf, ",");
while (p) {
int i = find_opt(p, opt);

if (i < 0) {
fprintf(stderr, "Unknown option %s\n", p);
exit(1);
}

res |= (1u << i);

p = strtok(NULL, ",");
}

return res;
}

int main()
{
const char *opt[] = {
"knn", "lda", "lr", "kart", "nb", "svm", NULL
};
char *msg = " knn, lda, svm ";
unsigned int u;
int i;

u = multi_opt(msg,opt);

for (i = 0; opt[i]; i++) {
printf("%s: %s\n", opt[i], (u & 1u << i) ? "on" : "off");
}

return 0;
}

关于c - 多个逗号分隔值的 getopt 错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43846090/

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