【问题标题】:Proper getopt usage正确使用 getopt
【发布时间】:2013-09-01 00:35:07
【问题描述】:

Here 有一个关于如何使用 GNU getopt 的示例。我了解大部分代码,但我有一些问题:

  1. 为什么要包含 ctype lib?

    我的意思是getopt 需要unistd.hstdlib.h 需要abortstdio.hio 的标准库。

  2. 在默认情况下,我们为什么要使用 abort?不能'我们只使用 return 1;?

  3. 如果可能的话,我希望有人分享一个链接,其中包含更多关于 optoptoptindoptarg 的详细信息。

【问题讨论】:

    标签: c gnu arguments


    【解决方案1】:
    1. isprint() 需要 ctype
    2. 不确定 - 如果您不在 main 函数中执行此操作,它可能会稍微有用,但打印错误然后调用 exit(1) 可能会更好;我想这只是一个最小的例子,一行比两行短
    3. 这里有几个你可能会觉得有用的链接:

    简而言之:

    optoptoptindoptarg 是外部符号。它们是全局的,并在 unistd.h 中声明。

    optopt (opt = option) 通常不需要。应该和调用getopt返回的值一样。

    optarg (arg = argument) 很简单。这是一个标志的参数。例如如果-f 是一个需要文件名参数的选项(optstring 包含f:),你可以这样做

        case 'f':
           filename = optarg;
           break;
    

    optindind 表示index)告诉您在您的while (flag = getopt...) 块结束后选项过程在哪里完成。

    例如在添加选项处理之前,您的脚本可能如下所示

    // print command line arguments, start at 1 to skip the program name
    for (int i = 1; i < argc; i++) {
        printf("arg[%d]=%s\n", i, argv[i]);
    }
    

    添加 getopt 块来处理选项后,您可以这样做

    // print command line arguments remaining after option processing
    for (int i = optind; i < argc; i++) {
        printf("arg[%d]=%s\n", i, argv[i]);
    }
    

    // skip command line options
    argc -= optind; argv += optind;
    // print command line arguments
    for (int i = 0; i < argc; i++) {
        printf("arg[%d]=%s\n", i, argv[i]);
    }
    

    如果您没有任何必需的命令行参数,那么您不必担心optind

    【讨论】:

    • 非常感谢您的回答!您分享的 2 个链接似乎包含有价值的信息。那就回去学习吧。 :)
    猜你喜欢
    • 2011-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多