首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C getopt,strdup函数代码

C getopt,strdup函数代码
EN

Stack Overflow用户
提问于 2012-09-14 16:54:17
回答 3查看 1.6K关注 0票数 1
代码语言:javascript
复制
  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在这段代码中做了什么?

谢谢。

EN

回答 3

Stack Overflow用户

发布于 2012-09-14 17:04:22

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

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

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

票数 2
EN

Stack Overflow用户

发布于 2012-09-14 17:02:26

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

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

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

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

票数 1
EN

Stack Overflow用户

发布于 2012-09-14 16:58:36

  1. r:u:....:字母表示可以在命令行中指定的标志,:表示此处需要额外的参数
  2. strdup复制字符串
  3. 将字符串转换为无符号的长
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12421109

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档