getopt(3)

来源:互联网 发布:日本南北朝 知乎 编辑:程序博客网 时间:2024/06/16 14:43

关于使用这个函数的意义,我现在还是没有什么领悟,只是在阅读APUE时遇到了这个函数,现在也只好原封不动的引用APUE19.5章里的原话“helps us parse command-line arguments in a consistent manner”。但是这本书里并没有对这个函数的详细解释,只是在实例程序中直接调用了它,我就只好打开shell来“man一下”,这里把相关的自己的理解写下来,帮助自己加深点理解,也能在后面忘记的时候不用再费力从大篇幅的手册中找出自己想要的哪一部分。


函数原型:

#include <unistd.h>int getopt(int argc, char * const argv[],const char *optstring);extern char *optarg;extern int optind, opterr, optopt;

argc和argv分别是在启动程序时传递给main函数的参数个数和参数数组。argv数组里以’-‘为起始字符的元素是一个选项元素(option element),选项元素里的其他字符(除了起始字符’-‘)都称为 选项字符(option character) 。 如果getopt()函数被反复地调用,它就会连续地返回每一选项元素中的选项字符。
optind变量是数组argv里下一个被处理的元素的索引,系统将这个值初始化为1。
getopt找到一个选项字符就会返回这个选项字符,更新optind变量以及静态变量nextchar,这样下次调用getopt函数时,它就能从下一个选项字符或者下一个选项元素开始。
当遍历完所有的选项字符时,getopt返回-1。optind是argv数组里第一个非选项元素的索引。
optstring是一个包含合法选项字符的字符串,如果一个选项字符后是一个冒号’:’,表示这个选项字符需要一个参数,这个参数可以是 当前选项元素的剩余字符串, 或者是argv数组里 下一个元素 。getopt函数会将optarg指针指向这个字符串。两个冒号则代表这个选项字符的参数时可选的,如果在当前的argv数组元素里包含非选项字符的其他字符 (“-oarg”),则这个参数通过optarg返回,否则optarg被设置为空指针(0)。
默认情况下,getopt会在扫描的过程中给argv数组里的元素重新排序,使得所有的非选项元素排列再argv数组的最后面。还有另外两种模式,如果optstring的第一个字符是‘+’时,或者设置了环境变量“POSIXLY_CORRECT”时,选项的扫描处理再遇到第一个非选项元素时就不再继续下去了。optstring第一个字符时‘-’时此处暂不论,还没有遇到这种情况,有点无法理解。
如果getopt遇到一个无法识别的选项字符时,它会向strerr打印错误信息,将这个选项字符存储再optopt中,然后返回’?’。调用程序可以通过将opterr设置为0来关闭错误信息的打印。
当getopt发现一个“惊喜”的选项字符,或者有选项参数没有给出时,它就将optopt设置为实际的选项字符,并且返回’?’。
如果上述的‘+’或者‘-’号后的第一个字符是冒号‘:’,getopt不是返回‘?’号而是返回一个冒号来表示有选项参数没有给出。

0 0
原创粉丝点击