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

标签 c csv validation command-line getopt

如何针对从 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/

相关文章:

c - 查找 C 源代码可能存在的问题的工具和方法

c - fscanf 总线错误 : 10 when switching from Snow Leopard to Lion

scala - Scala:以一种有效的方式遍历CSV文件吗?

java - 无法获取 struts.xml 以连接到 struts-2.0.dtd

Jquery 有助于强制文本区域的最大长度?

c - 在 C 套接字通信中设置多个定时器

Python从gzip压缩文件中读取csv行

javascript - 从 csv 文件检查邮政编码

c# - 隐藏的 int 属性验证

c - 需要 C 方面的基本帮助