1
  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 在这段代码中做了什么?

谢谢。

4

3 回答 3

2

在将问题发布到 StackOverflow 之前,您应该真正研究一下您的问题。也就是说,有一个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并将字符串转换为无符号长整数。

于 2012-09-14T09:04:22.107 回答
1

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

有关更多信息,请查看此处:http ://www.gnu.org/software/libc/manual/html_node/Getopt.html

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

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

于 2012-09-14T09:02:25.553 回答
0
  1. r:u:.... :字母代表您可以在命令行中指定的标志, : 表示那里需要一个额外的参数
  2. strdup 复制一个字符串
  3. strtoul 将字符串转换为无符号长整数
于 2012-09-14T08:58:35.913 回答