C getopt - <integer> </integer>

时间:2010-08-16 03:31:52

标签: c getopt

如何从命令行参数 - “ tail -10 ”获取 -10 选项。 getopt函数找到'1'字符。但是如何访问字符串“10”

如果这可以通过getopt_long来完成,那么一个例子会有所帮助。感谢。

4 个答案:

答案 0 :(得分:3)

除非您打算-1作为0作为其参数的选项,否则答案是您没有。 getopt仅用于处理符合标准POSIX实用程序选项语法的选项。可以使用GNU getopt_long来实现此目的,或者您可以编写自己的argv解析器(这很容易)。

编辑:其实我觉得我误读了你想要的东西。如果您希望将-后跟任何数字解释为具有该数值的选项,我认为没有任何版本的getopt可以使用。作为一个选项,你无法将每个数字作为特殊情况,如果只是告诉getopt所有数字都是带参数的选项字符,-123将被解释为{{1}参数为-1的选项(很好,您可以从那里解释),但是单独的23会导致下一个-1元素获得argv作为eaten的论据,这很难或无法从中恢复。

答案 1 :(得分:3)

这里发生的是c语言附带绝对没有关于处理命令行选项的正确方法的标准。

此外,unix世界在相当一段时间内没有这样的标准(相信在Unix Haters Handbook (PDF link)中有关于它的整个部分。)

因此,人们编写了 ad hoc 处理机制。这些最终演变为一个共同的(ish)标准,并且getopt诞生了(在贝尔实验室)。后来我们得到了GNU getoptgetopt_long。但是,这些并不是必需的,有些程序仍以自己的方式管理事物。

但是在事情稳定下来之前(偶尔会有事情发生),人们在处理选项的“通常”方式中添加了新功能,只要它们看起来是个好主意。现在,tail希望比其他任何功能都更频繁地调整数字行,这是一个不错的选择,因此使其 easy 几次击键进行调整当时似乎是一个好主意......

答案 2 :(得分:0)

我从来没有像那样喜欢getopt,所以我做了平常的事情并重新发明了轮子。我称之为解决方案argopt。您可以在https://github.com/colding/argopt获取源和手册页。我认为,它比getopt更容易使用。

答案 3 :(得分:0)

在可能的情况下,我建议更改命令参数语法以避免数字参数,方法是将数字作为选项参数传递(例如-n -5)或仅在--选项分隔符后允许它。

对于无法更改参数语法的情况,BUGS section of the BSD getopt(3) man page会记录一种方法。我已调整其解决方案以避免optreset,即not specified by POSIXnot supported by glibc

int ch;
long num;
char *numarg;

while ((ch = getopt(argc, argv, "0123456789")) != -1) {
    switch (ch) {
    case '0': case '1': case '2': case '3': case '4':
    case '5': case '6': case '7': case '8': case '9':
        numarg = argv[optind - 1];
        if (numarg[0] == '-' && numarg[1] == ch && numarg[2] == '\0') {
            num = '0' - ch;
        } else if ((numarg = argv[optind]) != NULL && numarg[1] == ch) {
            char *ep;
            int numoptind = optind;

            num = strtol(numarg, &ep, 10);
            if (*ep != '\0') {
                fprintf(stderr, "illegal number -- %s\n", numarg);
                return EXIT_FAILURE;
            }

            /* Advance getopt internal state to next argument. */
            while (optind == numoptind) {
                ch = getopt(argc, argv, "0123456789");
                assert(ch >= '0' && ch <= '9');
            }
        } else {
            fprintf(stderr, "number after other options -- %s\n", numarg);
            return EXIT_FAILURE;
        }
        break;

    default:
        /* Unrecognized option character.  Error printed by getopt. */
        return EXIT_FAILURE;
    }
}

您可以将getopt替换为getopt_long,并根据需要添加其他短期或长期选项。