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

标签 c argv

我定义了一些 int 类型的全局变量,我希望它们与命令行参数匹配,以避免无限的 if 链带有 strcmp 的语句。例如,如果我定义了全局变量 myvar ,用户输入 myvar作为命令行参数,我希望能够引用 myvar并使用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]argv[3] ,引用全局变量 A、B 或 C:

int* A;
int* B;
int* C;

int set(void)
{
    gargv[2] = gargv[3];
    // example, if A and 10 given by user then set A = 10 and return
}

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 设置所有配置变量。

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

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

如果 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;
}

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

关于c - 引用使用 argv[] 传入的全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44253223/

相关文章:

文本到二进制转换器的类型冲突?

c - Scanf 函数不等待字符串输入

C - 带参数的计算器

c - 有没有来自标准输入的东西?

c - Delphi 记录和 C 结构

c - 扫描成结构

python - Ctypes将float传递给函数返回随机数

c - 使用 argv 访问参数

汇编:__p___argv 的返回值

c++ - 如何将 C++ 代码中的参数(argc、argv)传递到 MatLab Mex 文件中?