- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
如何针对从 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/
是否可以将参数传递给通过 getopt::long 调用的子例程?例如,当用户在命令行上指定 script.pl -pandora argument 时,我有此代码调用 &Salt GetOption
我正在尝试将 getopts 用于 bash 脚本。这个脚本可以有标志,所有这些标志都是强制性的,需要包含一个值。当本应包含值的强制标志之一为空时,getopts 使用下一行标志作为其内容。我该如何防
我公司使用 Getopt::Declare 作为其命令行选项解析器。我们的期权处理 block 的结构通常如下所示: Readonly my $ARGS => Getopt::Declare->new
我有一个带有可能的命令行参数的字符串(使用 Read-Eval-Print-Loop 程序),我希望它在传递给 Getopt::Long 时被解析为类似于命令行参数。 详细说明: 我有一个字符串 $s
我刚刚在代码审查中第一次被要求检查对 GetOptions() 的调用的返回码。 Getopt::Long 的功能Perl 模块。 我不记得曾经看到过这样的 GetOptions() 测试。功能。 那
我有这个 getopt: GetOptions( GetOptions ("library=s" => \@libfiles); @libfiles = split(/,/,join(','
我想使用 Getopt::Long::GetOptions 获取脚本的命令行选项。 我有这样的需求: perl script.pl -c -c -m argument 这里我们有选项标志 -c
我正在尝试使用 getopt() 解析命令行参数。下面是我的代码。无论我在运行程序时传递什么参数,getopt() 总是返回 -1。 例如: $ gcc -o test test.c $ ./test
在我的 python 脚本中使用 getopt.getopt() 函数时,临时返回值保持为空。我缺少什么。 def ParseOpts(cmdName): shortForm = 'c:n:'
我想使用 getopt,但它行不通。 它给了我 gcc -g -Wall -std=c99 -ftrapv -O2 -Werror -Wshadow -Wundef -save-temps -Werr
有人可以帮助我使用 getopt 函数吗? 当我在 main 中执行以下操作时: char *argv1[] = {"testexec","-?"}; char *argv2[] = {"testex
我有一个脚本,它从 CLI 获取 3 个输入变量并将其分别插入到 3 个变量: GetOptions("old_path=s" => \$old_path, "var=s" =
如何以这种方式接受命令行参数: ./a.out --printall 所以在我的程序中,我有类似的东西 if (printall) { // do something } 我不想这样做: if (
在 Perl getopts 中,是否可以多次使用相同的选项但具有不同的值?我想为用户提供输入不同网格坐标的选项,但使用相同的选项名称以尽量减少混淆。 例如: my_grid.pl --coords=
是否有用于Groovy的标准或推荐的getopts库,该库可以让我快速处理Groovy中的长期和短期命令行争论? groovy foo.groovy --fname = foo.txt --outpu
use Getopt::Long::Configure(pass_through); # .... GetOptions( "display=s" => \$display,
我正在运行 bash 4.2 版,我正在尝试使用内置命令 getopts 解析命令行参数, 但是getopts好像没有正确解析,如果-s不是第一个参数,就不会被解析 -s 未解析: %> ./geto
GetOptions( "r|repo=s" => \$repo, "R|list-repos" => \$list, ); 当我用 -r qwe 调用这个脚本
我正在尝试使用 getopt() 从 PHP7 cli 获取选项,但是在调用 php myprocess.php task -d -o 时我得到一个空数组。不知道我错过了什么,希望你能帮助我。 这就是
我正在寻找一种方法来处理包含必须解析的空格的参数 通过 shell getopts 命令。 while getopts ":a:i:o:e:v:u:" arg do echo "ARG is:
我是一名优秀的程序员,十分优秀!