簡體   English   中英

多個逗號分隔值的 getopt 錯誤處理

[英]getopt error handling for multiple comma separated values

如何驗證從命令行接收到的逗號分隔值的多個組合的字符串變量用於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 的單個值,則可以處理。

當您允許使用逗號分隔的多個選項時,您必須在逗號處拆分字符串並處理每個標記。 拆分字符串的一種方法是來自<string.h>的庫函數strtok 比較它們時,請注意從標記中刪除空格。

另一個問題是你想如何表示結果。 一種方法是用適當的選項填充最初歸零的選項數組。 另一種方法是使用位組合,使選項 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;
}

您可以嘗試使用strtok()函數:

char *token;

token = strtok(optarg, ",");
while (token != NULL)
{
    if (!strcmp(token, "knn") && !strcmp(token, "lr") && !strcmp(token, "la")
        *error handling*
    token = strtok(NULL, ",");
}

PS: strtok()string.h的一部分

編輯:我認為這段代碼不會有你想要的行為。 這會更好:

char *token;
size_t i = 0;
char knn = 0, lr = 0, la = 0;

token = strtok(optarg, ",");
while (token != NULL)
{
    if (!strcmp(token, "knn") && knn == 0)
        knn = 1;
        ... // valid
    else if (!strcmp(token, "lr") && lr == 0)
        lr = 1;
        ... // valid
    else if (!strcmp(token, "la") && la == 0)
        la = 1;
        ... // valid
    else
    {
        printf("Wrong value entered for option -a\n");
        exit();
    }
    token = strtok(NULL, ",");
    i++;
}

if (i > 3)
{
    printf("Too many values entered for option -a\n");
    exit();
}
          char *alg,alg1;

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

這個 printf o/p :1。 你輸入了選項 -a "svm,lr"

                 alg1 = strtok(optarg, ",");
                 while (alg1 != NULL)
                     {
                      if(strcmp(alg1,"lr") == 0 )
                           {
                              //valid
                            }
                         '""""""
                         '"""""""
                      else
                          {
                          }
                      alg1 = strtok(NULL, ",");
                      j++;
                   }
                 printf("2.you entered option -a \"%s\"\n", alg);

這個 printf o/p :2。 您輸入了選項 -a "svm" 但預期:svm,lr

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM