2

我正在尝试解析 C 程序中的两个选项。

该程序是这样调用的:

./a.out [OPTIONS] [DIRECTORY 1] [DIRECTORY 2]

该程序同步两个目录并有两个选项。(-r)用于递归同步(文件夹内的文件夹),(-n)并将文件从本地复制到远程,以防远程中不存在。

Options are:
-r : recursive
-n : copy file if it doesn't exist in remote folder

所以调用:

./a.out -r D1 D2

将递归同步所有文件和目录从D1D2D1存在和不存在的文件将D2被忽略。

并调用:

./a.cout -rn D1 D2

会做同样的事情,但存在D1和不存在的文件D2被复制到D2.

问题是 call与call./a.out -rn不一样,也不能正常工作,因为is not 。./a.out -nr./a.out -r -n(-n)D1

以下是我实现 main 的方法。

int main(int argc, char** argv) {
  int next_option = 0;
  const char* const short_options = "hrn:";

  const struct option long_options[] = {
    { "help",      0, NULL,  'h' },
    { "recursive", 1, NULL,  'r' },
    { "new", 1, NULL,  'n' },
    { NULL,        0, NULL,  0   }
  };

  int recursive = 0;
  int new = 0;

  do {
    next_option = getopt_long(argc, argv, short_options, long_options, NULL);

    switch(next_option) {
      case 'r':
        recursive = 1;
        break;

      case 'n':
        new = 1;
        break;

      case 'h':
        print_help();
        return 0;

      case -1:
        break;

      default:
        print_help();
        return -1;
    }

  } while(next_option != -1);

  sync(argv[2], argv[3], recursive, new);

  return EXIT_SUCCESS;
}
4

2 回答 2

3

您在这里有两个(潜在的)问题:

  1. :您的短选项字符串中有一个流浪者。这使得-n采取吞下任何后续的选项r。您还可以设置长选项来接受强制参数。

  2. 您以不灵活的方式对参数编号进行了硬编码,并且您没有测试它们是否存在。

尝试这个:

int main(int argc, char** argv) {
  int next_option = 0;
  const char* const short_options = "hrn";
  extern int optind;

  const struct option long_options[] = {
    { "help",      no_argument, NULL,  'h' },
    { "recursive", no_argument, NULL,  'r' },
    { "new",       no_argument, NULL,  'n' },
    { NULL,        no_argument, NULL,  0   }
  };

  int recursive = 0;
  int new = 0;

  do {
    next_option = getopt_long(argc, argv, short_options, long_options, NULL);

    switch(next_option) {
      case 'r':
        recursive = 1;
        break;

      case 'n':
        new = 1;
        break;

      case 'h':
        print_help();
        return 0;

      case -1:
        break;

      default:
        print_help();
        return -1;
    }

  } while(next_option != -1);

  if (optind + 1 >= argc)
    return -1;

  sync(argv[optind], argv[optind+1], recursive, new);

  return EXIT_SUCCESS;
}
于 2012-12-11T11:41:44.307 回答
1

使用命令行的问题-r -n是因为您在对sync. 你不应该那样做。

如果您阅读getopt_long手册页(当您遇到功能问题时总是这样做!)然后您会注意到这一行:

如果没有更多选项字符,getopt()返回 -1。然后optind是第一个argv元素在argv中的索引,该元素不是选项。

仔细阅读第二句。

于 2012-12-11T11:37:39.313 回答