4

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

  1. 为什么包含 ctype lib?

    我的意思unistd.h是需要getoptstdlib.h需要abort并且 stdio.hio.

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

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

4

1 回答 1

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

简单来说:

optopt, optind, 和optarg是外部符号。它们是全局的,并在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.

于 2013-09-01T01:15:22.850 回答