getopterror handling多个逗号分隔值

如何为从getopt的命令行接收的逗号分隔值的多个组合validation字符串变量?

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()函数:

 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(); } 

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

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

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

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

 #include  #include  #include  #include  /* * 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; } 
  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