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:你......”的事情是如何运作的。
此外,strdup和strtoul在此代码中做了什么?
感谢。
答案 0 :(得分:2)
在将其发布到StackOverflow之前,您应该research your question。也就是说,有一个man page for getopt来描述optstring
参数:
optstring是一个包含合法选项字符的字符串。如果这样的字符后跟冒号,则该选项需要一个参数,因此getopt()在optarg中的同一个argv-element或以下argv-element的文本中放置一个指向以下文本的指针。两个冒号意味着一个选项需要一个可选的arg;如果当前argv-element中有文本(即,与选项名称本身相同的单词,例如“-oarg”),则在optarg中返回,否则optarg设置为零。这是一个GNU扩展。如果optstring包含W后跟分号,那么-W foo被视为long选项--foo。 (-W选项由POSIX.2保留用于实现扩展。)此行为是GNU扩展,在glibc 2之前的库中不可用。
strdup
是一个标准的C库函数,用于将字符串复制到新分配的缓冲区(因此不会弄乱其他人的副本),strtoul
将字符串转换为无符号长整数。
答案 1 :(得分:1)
冒号(:
)表示选项(单个字母)后面必须跟一个参数。该参数将存储在“optarg”中。
有关详细信息,请查看此处:http://www.gnu.org/software/libc/manual/html_node/Getopt.html
strdup()
是一个POSIX便捷函数,它分配一个缓冲区并将源字符数组复制到目标。
strtoul()
是一个从字符串中解析无符号整数并将它们作为unsigned long返回的函数。
答案 2 :(得分:0)