适当的getopt使用

时间:2013-09-01 00:35:08

标签: c gnu arguments

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

  1. 为什么包含ctype lib?

    我的意思是unistd.h需要getoptstdlib.h需要abort,而stdio.hio的标准库。< / p>

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

  3. 如果可能的话,我希望有人在optoptoptindoptarg上分享包含更多详情的链接。

1 个答案:

答案 0 :(得分:5)

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

  4. 简而言之:

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

    通常不需要

    optoptopt = option)。它应该与调用getopt返回的值相同。

    optargarg = argument)很简单。这是一个旗帜的争论。例如如果-f是需要文件名参数的选项(optstring包含f:),则可以执行类似

    的操作
        case 'f':
           filename = optarg;
           break;
    

    optindind表示index)告诉您while (flag = getopt...)阻止结束后选项流程的完成位置。

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

    // 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