引用使用argv []传入的全局变量

时间:2017-05-30 04:04:16

标签: c argv

我定义了一些int类型的全局变量,我希望它们与命令行参数匹配,以避免使用if strcmp语句的无限链。例如,如果我已定义全局变量myvar,并且用户键入myvar作为命令行参数,我希望能够引用myvar并使用{对其执行操作{1}}。可以这样做吗?

编辑我的问题只是为了让它更清晰:

目前,我必须这样做:

argv[]

但是,做这样的事情会少一些麻烦,我可以将int* A; int* B; int* C; int set(void) { if (strcmp((gargv[2]), "A") == 0) { *A = atoi(gargv[3]); return *A; } else if (strcmp((gargv[2]), "B") == 0) { *B = atoi(gargv[3]); return *B; } else if (strcmp((gargv[2]), "C") == 0) { *C = atoi(gargv[3]); return *C; } else { errx(EX_USAGE, "Invalid"); } } int main (int argc, char** argv) { gargv = argv; void* mem_chunk = calloc(5, sizeof(int)); A = &mem_chunk[1]; B = &mem_chunk[2]; C = &mem_chunk[3]; if (strcmp(argv[1], "set") == 0) { set(); } } 设置为argv[2],引用全局变量A,B或C:

argv[3]

2 个答案:

答案 0 :(得分:0)

你的问题很模糊。当然,您可以根据传递的命令行参数设置全局变量,首先检查/解析argv设置所有配置变量。

这实际上是命令行程序的典型结构,首先在程序中解析参数,然后在程序中稍后解析,只使用在解析过程中设置的配置值和标志。

它并不完全清楚,但我假设您还在寻找简化解析命令行参数的工具。嗯,有很多。在* nix系统上,标准库中通常有getopt()(它在POSIX中指定)。请注意,此联机帮助页还描述了getopt_long(),这是GNU扩展,仅适用于GNU C库(glibc)。

如果getopt()对于您需要的内容很简单,或者您希望在Windows等系统上使用它,请查看一个古老且众所周知的命令行解析库:popt。几乎所有使用google的系统都可能会找到popt个实现。

然后总是有可能一次自己编写并自己重复使用它。我有my own,因为我需要一个有状态解析的命令行界面,就像脚本语言一样 - 只是为了给你一个想法。

你的问题让我想到了这样的命令行:

> yourprogram foo=nanana bar=frobnicate

您希望在程序中设置变量foobar。这不是使用带有可选参数和位置参数的开关的典型命令行界面,因此getopt()不会完全提供给您。但是为这个编写解析器非常容易,正如这个小小的演示所示:

#include <stdio.h>

// configuration for the parser:
struct argvVar
{
    const char *name;    // the name of the variable to look for
    const char **value;  // the address of the variable to set the value
};

void parseArgvVars(int argc, char **argv, const struct argvVar *vars)
{
    // loop over argv:
    for (int i = 1; i < argc; ++i)
    {
        // loop over configuration items:
        const struct argvVar *var = vars;
        while (var->name)
        {
            // compare variable name with current argument:
            const char *vname = var->name;
            const char *arg = argv[i];
            while (*arg && *vname)
            {
                // when different, try the next configured variable:
                if (*arg != *vname) goto nextVar;
                ++arg;
                ++vname;
            }
            if (*arg == '=')
            {
                // when matching and the following sign is an equals sign,
                // assign to the variable:
                *var->value = arg + 1;
            }
nextVar:
            ++var;
        }
    }
}

int main(int argc, char **argv)
{
    const char *foo = 0;
    const char *bar = 0;
    const char *baz = 0;

    // list of variables we want to assign from argv values:
    const struct argvVar vars[] = {
        {"foo", &foo},
        {"bar", &bar},
        {"baz", &baz},
        {0, 0} // end of list
    };

    parseArgvVars(argc, argv, vars);

    if (foo) printf("foo: %s\n", foo);
    if (bar) printf("bar: %s\n", bar);
    if (baz) printf("baz: %s\n", baz);

    return 0;
}

尝试理解配置结构的用法和解析函数的一般特性,这样您就可以学习如何解决问题并经常重用代码。

答案 1 :(得分:-1)

您必须使用getopt()或strncmp()。 例如:

strncmp(argv[index], your_string, dim);