【问题标题】:getopt not working correctly when run from unix command line从 unix 命令行运行时 getopt 无法正常工作
【发布时间】:2013-04-19 04:45:20
【问题描述】:

我编写(从 Google 复制和粘贴并简化)一个 C 程序,使用 getopt 打印从 Unix 命令行传入的参数的值。

从 Unix 命令行:

./myprog -a 0 -b 1 -c 2

我的 C 代码是:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
    int i;

    while ((i = getopt(argc, argv, "abc")) != -1) {
        switch (i) {
            case 'a': 
               printf("A = %s\n", optarg);
               break;

            case 'b': 
               printf("B = %s\n", optarg);
               break;

            case 'c': 
               printf("C = %s\n", optarg);
               break;

            default:
                break;
        }
    }

    return 0;
}    

我想编写程序打印出每个传递的值,例如

A = 0
B = 1
C = 2

但是它根本没有打印出任何东西。

【问题讨论】:

    标签: c linux unix command-line-arguments getopt


    【解决方案1】:

    在任何带有参数的选项之后,您都会忘记“:”。如果换一行

    while ((i = getopt(argc, argv, "a:b:c:")) != -1) {
    

    您将获得工作变体。

    正确阅读man 3 getopt,它说的是getopt的第三个参数

    ... optstring 是一个包含合法选项字符的字符串。如果这样的字符后跟冒号,则该选项需要一个参数,因此 getopt() 将指向同一 argv 元素中以下文本的指针,或 optarg 中以下 argv 元素的文本。两个冒号表示一个选项 接受一个可选参数;如果当前 argv 元素中有文本(即,与选项名称本身在同一个词中,例如,“-oarg”),那么它是 在 optarg 中返回,否则 optarg 设置为零。 …

    【讨论】:

    • 谢谢@Eddy_Em。那已经解决了。只是想知道像我最初拥有的那样使用合并字符,因为我在很多 getopt 示例中看到了这种格式,例如“a:bc:d:ef”。 bc 相对于 b:c 是什么意思?
    • 顺便说一句,man 3 getopt 中有两个使用示例 getoptgetopt_long
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2013-01-18
    相关资源
    最近更新 更多