【问题标题】:C getopt,strdup function codeC getopt,strdup函数代码
【发布时间】:2012-09-14 08:54:17
【问题描述】:
  while ((c = getopt(ac, av, "r:u:p:h:P:s:S:t:iRbo:n:")) != EOF)
        {
            switch(c)
                {
                case 'b':
                    isbsd++;
                    break;
                case 'R':
                    detectos++;
                    break;
                case 'r':
                    root = strdup(optarg);
                    break;
                case 'i':
                    is_scramble = 1;
                    break;
                case 's':
                    saddr = strtoul(optarg, 0, 0);
                    break;
                case 't':
                    timeout = strtoul(optarg, 0, 0);
                    break;
                case 'S':
                    size = strtoul(optarg, 0, 0);
                    break;
                case 'u':
                    user = strdup(optarg);
                    break;
                case 'p':
                    pass = strdup(optarg);
                    break;
                case 'h':
                    host = strdup(optarg);
                    break;
                case 'P':
                    port = strtoul(optarg, 0, 0);
                    break;
                case 'o':
                    heapbase = strtoul(optarg, 0, 0);
                    break;
                case 'n':
                    scnum = strtoul(optarg, 0, 0);
                    break;
                default:
                    usage(av[0]);
                }
        }

我对 getopt 功能很陌生,从未使用过它。 (ac 是 argc,av 是 argv)

那么,这段代码是如何运作的呢?我感到困惑的是“r:u ...”的工作原理。

另外,strdup 和 strtoul 在这段代码中的作用是什么?

谢谢。

【问题讨论】:

  • "strdup 和 strtoul 在这段代码中做了什么?"您是否尝试过阅读文档以了解这些函数的作用?
  • 你读过docs for getopt 吗?那里都有解释。

标签: c


【解决方案1】:

在将其发布到 StackOverflow 之前,您真的应该 research your question。也就是说,有一个 man page for getopt 描述了 optstring 参数:

optstring 是一个包含合法选项字符的字符串。如果这样的字符后跟一个冒号,则该选项需要一个参数,因此 getopt() 将指向同一 argv 元素中的以下文本的指针,或 optarg 中以下 argv 元素的文本。两个冒号表示一个选项带有一个可选参数;如果当前 argv 元素中有文本(即与选项名称本身在同一个词中,例如“-oarg”),则在 optarg 中返回,否则 optarg 设置为零。这是一个 GNU 扩展。如果 optstring 包含 W 后跟分号,则 -W foo 被视为长选项 --foo。 (POSIX.2 为实现扩展保留 -W 选项。)此行为是 GNU 扩展,在 glibc 2 之前的库中不可用。

strdup 是一个标准的 C 库函数,用于将字符串复制到新分配的缓冲区(这样您就不会弄乱别人的副本),strtoul 将字符串转换为无符号长整数。

【讨论】:

    【解决方案2】:

    冒号(:)表示选项(单个字母)后面必须跟一个参数。此参数将存储在“optarg”中。

    更多信息,请看这里:http://www.gnu.org/software/libc/manual/html_node/Getopt.html

    strdup() 是一个 POSIX 便利函数,它分配一个缓冲区并将源字符数组复制到目标。

    strtoul() 是一个从字符串中解析无符号整数并将它们作为无符号长整数返回的函数。

    【讨论】:

      【解决方案3】:
      1. r:u:....:字母代表可以在命令行中指定的标志,: 表示此处需要额外的参数
      2. strdup 复制字符串
      3. strtoul 将字符串转换为无符号长整数

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-18
        • 1970-01-01
        • 1970-01-01
        • 2015-07-22
        • 2021-08-18
        • 1970-01-01
        • 1970-01-01
        • 2010-09-19
        相关资源
        最近更新 更多