【问题标题】:Am I understanding getopt() correctly?我是否正确理解 getopt() ?
【发布时间】:2012-12-07 17:17:53
【问题描述】:

我正在尝试扫描命令行中的某些字母、符号和值。我想扫描"-w"、一个数字和"-s"。我在上一个问题中得到了答复,有人告诉我使用getopt(),经过一番谷歌搜索后,我想我可能会明白,但我不确定。

这就是我认为我正在做的事情:

int c = 0; 
int b = argv[2];

while((c = getopt(argc, argv, "-w", "-s", b))

我想我正在为"-w""-s"argv[2] 值(即数字)扫描argc。但我不知道我是否正确使用它?

【问题讨论】:

  • 检查 getopt 的手册页 - 它需要多少参数 - 3. 你传递了多少 - 4. 你的代码甚至可以编译吗?

标签: c getopt


【解决方案1】:

你的 while 循环应该是 while ((c = getopt(argc, argv, "w:s:"))

: 冒号表示它需要一个参数。现在将optarg 转换为整数或任何你想要的。

【讨论】:

    【解决方案2】:
    int number = 0;
    int sflag = 0;
    int opt;
    
    while ((opt = getopt(argc, argv, "w:s")) != -1)
    {
        switch (opt)
        {
        case 's':
            sflag = 1;
            break;
        case 'w':
            number = atoi(optarg);
            break;
        default:
            /* Report usage and exit? */
            break;
        }
    }
    

    对数字的转换是惰性的;例如,您可以更仔细地调用调用strtol() 的函数。您可能需要有一个类似于sflag 变量设置的wflag 变量,以便您可以区分-w 0 和“没有在命令行上指定-w 选项”。

    【讨论】:

    • 现在,我对一件事感到困惑。当我使用 getopt 或 optarg 时,VS 给我一个错误,说 getopt 和 optarg 都未定义。我对 C 很陌生(到目前为止只做了一些程序),我不确定为什么会遇到这个问题。
    • 那么您是在 Windows 上使用 Visual Studio 进行编译的吗?上次检查时,Microsoft 运行时库(MSVCRT)没有getopt 函数。
    • 在 Unix 上,getopt()<unistd.h> 中声明,这也将声明全局变量。 (从历史上看,一些系统在<stdio.h> 中声明了getopt(),但我们可以放心地假设它不存在,因为您收到错误消息。)您需要了解Microsoft 是否支持它,如果支持它在哪里声明函数和变量。它有可能根本不这样做。它有可能在名称前加上下划线。如果一切都失败了,请获取 GNU getopt() 及其 <getopt.h>
    • 对“getopt source at&t public domain”进行谷歌(或您选择的其他搜索引擎)搜索。您将找到getopt() 版本的源代码,该版本大约在 1985 年由 AT&T 置于公共域中。您需要将其转换为 ANSI C,否则,您应该很高兴。跨度>
    猜你喜欢
    • 2020-04-29
    • 1970-01-01
    • 2011-05-05
    • 2020-11-22
    • 2011-01-29
    • 2016-05-03
    • 2011-03-01
    • 2011-08-05
    • 2020-09-30
    相关资源
    最近更新 更多