- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想获取此命令的选项:
my_cmd show --value true -D
为此,我需要通过选项两次(由于架构)。在第二遍期间,无法正确检索与其选项对应的参数。在此示例中,在第二次传递期间检索到的参数(对于选项 --value
)是 -D
而不是 true
。
第一关:
void getoptions (int argc, char **argv, globalargs_t* globalargs) {
static const char *optstring = "vDqnd:c:f:o:h?:";
static const struct option longopts[] = {
{ "help", no_argument, NULL, 'h' },
{ "Debug", no_argument, NULL, 'D'},
{ "verbose", no_argument, NULL, 'v'},
{ "quiet", no_argument, NULL, 'q'},
{ "noheader", no_argument, NULL, 0},
{ "delimiter", required_argument, NULL, 0},
{ "columns", required_argument, NULL, 0},
{ "filter", required_argument, NULL, 0},
{ "order", required_argument, NULL, 0},
{ "getid", no_argument, NULL, 'i'},
{ NULL, no_argument, NULL, 0 }
};
int opt = 0;
int longindex = 0;
//opterr = 0;
/* Process the arguments with getopt_long(), then populate globalargs-> */
opt = getopt_long( argc, argv, optstring, longopts, &longindex );
while( opt != -1 ) {
switch( opt ) {
case '?':
break;
case 'D':
globalargs->debug = 1; /* true */
break;
case 'v':
globalargs->verbose++;
break;
case 'q':
globalargs->quiet = 1;
break;
case 'i':
globalargs->id = 1;
break;
case 'h':
globalargs->help = 1;
break;
case 0: /* long option without a short arg */
if( strcmp( "Debug", longopts[longindex].name ) == 0 ) {
globalargs->debug = 1;
}
if( strcmp( "verbose", longopts[longindex].name ) == 0 ) {
globalargs->verbose = 1;
}
if( strcmp( "quiet", longopts[longindex].name ) == 0 ) {
globalargs->quiet = 1;
}
if( strcmp( "noheader", longopts[longindex].name ) == 0 ) {
globalargs->noheader = 1;
}
if( strcmp( "delimiter", longopts[longindex].name ) == 0 ) {
globalargs->delimiter = *optarg;
}
if( strcmp( "filter", longopts[longindex].name ) == 0 ) {
globalargs->filter = optarg;
}
if( strcmp( "order", longopts[longindex].name ) == 0 ) {
globalargs->order = optarg;
}
if( strcmp( "columns", longopts[longindex].name ) == 0 ) {
globalargs->columns = optarg;
}
break;
default:
/* You won't actually get here. */
break;
}
opt = getopt_long( argc, argv, optstring, longopts, &longindex );
}
if (optind < argc) {
while (optind < argc) {
globalargs->actions[globalargs->actionsindex] = argv[optind++];
globalargs->actionsindex++;
}
}
}
第二遍:
void getspecificoptions(int argc, char **argv, globalargs_t* globalargs) {
static const char *optstring = ":n:d:v:d";
static const struct option longopts[] = {
{ "name", required_argument, NULL, 'n'},
{ "domain", required_argument, NULL, 0},
{ "value", required_argument, NULL, 0},
{ "defined_value", required_argument, NULL, 0},
{ NULL, no_argument, NULL, 0 }
};
optind = 1;
int opt = 0;
int longindex = 0;
/* Process the arguments with getopt_long(), then populate globalargs-> */
opt = getopt_long( argc, argv, optstring, longopts, &longindex );
while( opt != -1 ) {
switch( opt ) {
case 'n':
/* If used in update/add => must be still a filter */
globalargs->filter = strcat(globalargs->filter,"cluster.name=");
globalargs->filter = strcat(globalargs->filter, optarg);
if(!globalargs->table || strcmp(globalargs->table, "cluster") == 0 ) {
globalargs->table = "cluster";
}
else {
clmError(&t, "dbm-command", -1, "Incompatible options.");
exit(EXIT_FAILURE_OPTIONS);
}
break;
case 0: /* long option without a short arg */
if( strcmp( "domain", longopts[longindex].name ) == 0 ) {
}
else {
char* f = my_new(500*sizeof(char));
f = strcat(f, "cluster.dns_domain=");
f = strcat(f, optarg);
globalargs->actions[globalargs->actionsindex] = f;
globalargs->actionsindex++;
}
if(strcmp(globalargs->table,"") == 0 || strcmp(globalargs->table, "cluster") == 0 ) {
globalargs->table = "cluster";
}
else {
clmError(&t, "dbm-command", -1, "Incompatible options.");
exit(EXIT_FAILURE_OPTIONS);
}
}
if( strcmp( "value", longopts[longindex].name ) == 0 ) {
if(strcmp(globalargs->actions[0], "show") == 0 || strcmp(globalargs->actions[0], "delete") == 0 ) {
globalargs->filter = realloc(globalargs->filter, strlen(globalargs->filter) + strlen(optarg) + strlen("cluster_profile.value=") + 1);
globalargs->filter = strcat(globalargs->filter,"cluster_profile.value=");
globalargs->filter = strcat(globalargs->filter, optarg);
}
else {
char* act = my_new(strlen(optarg) + strlen("cluster_profile.value=") + 1U);
act = strcat(act, "cluster_profile.value=");
act = strcat(act, optarg);
globalargs->actions[globalargs->actionsindex] = act;
globalargs->actionsindex++;
}
if(strcmp(globalargs->table,"") == 0 || strcmp(globalargs->table, "profile") == 0 ) {
globalargs->table = "profile";
}
else {
clmError(&t, "dbm-command", -1, "Incompatible options.");
exit(EXIT_FAILURE_OPTIONS);
}
}
if( strcmp( "defined_value", longopts[longindex].name ) == 0 ) {
/* If used in update/add => must be still a filter */
globalargs->filter = strcat(globalargs->filter,"cluster_profile.defined_value=");
globalargs->filter = strcat(globalargs->filter, optarg);
if(!globalargs->table || strcmp(globalargs->table, "profile") == 0 ) {
globalargs->table = "profile";
}
else {
clmError(&t, "dbm-command", -1, "Incompatible options.");
exit(EXIT_FAILURE_OPTIONS);
}
}
break;
}
opt = getopt_long( argc, argv, optstring, longopts, &longindex );
}
}
在这些传递之后,我有 globalargs->filter="-D"
。
如有任何帮助,我们将不胜感激。
谢谢!
最佳答案
必须将 optind 重置为 0 而不是 1。第一次通过时,限定标志被解析,但第二次则没有,因为 optind 是 1 而不是 0。将其设置为 0 会重新解析字符串。
optstring 的第一个字符也必须是 + 或 -(在前导冒号之前)以防止参数被重新排序。
这一切都假设您使用的是 GNU 的 getopt_long。
关于C Getopt : Wrong argument corresponding to its option,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11867636/
git count-objects -v 发出的这个警告是什么意思? Google 只给了我 git 本身的来源。 warning: no corresponding .pack: .git/obje
我要MOVE来自 itab1 的字段至 itab2基于它们的字段名称。我试过以下: CLEAR itab2. MOVE-CORRESPONDING itab1 TO itab2. 这是有效的,但只要
我要MOVE来自 itab1 的字段至 itab2基于它们的字段名称。我试过以下: CLEAR itab2. MOVE-CORRESPONDING itab1 TO itab2. 这是有效的,但只要
假设您将一个项目分解为一个 super 项目和一个子模块。它们都有稳定的(主)分支和开发分支。有没有办法设置您的子模块,以便 super 项目从其 dev 分支跟踪子模块的 dev 分支,并从其稳定分
我有一个列表,其中包含两种不同的商品,product-x 和 product-y。 当用户删除 product-x 时,我需要它的等效 product-y 也删除,反之亦然。 我已经尝试了几种不同的方
下面的示例显示了一个 box div 和一个 :after 内容,它应该是一个单独的 block 。 div.box { background-color: #FAA; width:
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 6 年前。 Improve
我使用的是 ABAP 7.4 SP13。 我想在下面的代码中使用“选项 2”,但是如何进行这种深度映射?这里的目标是有一个干净、简单、易于阅读的映射,避免循环。 TYPES: BEGIN OF
我试图充分了解 docker 的功能,以便对我安全地使用它产生合理的信心。对此的一个建议是始终使用 USER Dockerfile 中的语句。在试图理解这一点的影响时,我遇到了一些麻烦。 具体问题:
我在 Flutter Web 应用程序中使用命名路由进行导航。导航到所需的路由时,URL 会更新,但我无法通过 URL 栏直接导航到该路由。每次我尝试在 URL 中添加路径时,它都会将我带到“.../
我重命名了一个文件夹并更新了命名空间声明,但 ReSharper 6 声称命名空间应该反射(reflect)重命名之前的情况。文件位置数据存储在哪里? 最佳答案 检查并确保您的程序集名称与新的命名空间
我正在 Shopify 上创建带有折扣的草稿订单,其返回错误类似于“必须与根据值计算出的值相对应”。 我计算折扣如下: $amount 是订单总金额 (78.99),$rate (30) 是折扣百分比
我正在使用pyspark.ml.classification中的RandomForestClassifier 我在二进制类数据集上运行模型并显示概率。 我的列概率如下: +-----+--------
我正在尝试绘制以不同角度记录的传感器数据。 import pandas as pd import matplotlib.pyplot as plt #create dataframe, each
我的 ASP.NET 页面没有显示控件。它只是显示母版页错误 The page has one or more controls that do not correspond with 代替 关
问题: 我有一大堆日期,我需要按周排列它们。 问题:如何按日期所在的一年中的第几周对日期进行分组? 示例数据集 Date date = new SimpleDateFormat.parse("04/0
我想获取此命令的选项: my_cmd show --value true -D 为此,我需要通过选项两次(由于架构)。在第二遍期间,无法正确检索与其选项对应的参数。在此示例中,在第二次传递期间检索到的
本地代码 native .c #include #include #include jstring Java_com_lab5_oli_myapplication_MainActivity_he
我正在使用 Firebase Python AdminSDK 生成自定义 token ,Javascript 客户端使用该 token 登录 Firebase。当 JS 客户端尝试使用自定义 toke
在上面的 excel 表中,我需要一个公式来提取存在“1”的特定列名,然后在相应的单元格中输入该名称。示例 - 在上面的图像中,对应于 col“Tags”的每一行都包含相应单元格包含“1”的列名。 最
我是一名优秀的程序员,十分优秀!