C:以正确的方式解析选项

时间:2012-12-11 11:23:12

标签: c parsing arguments main purify

我正在尝试解析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

将递归地同步从D1D2的所有文件和目录。 <{1}}中显示的文件以及D1中不存在的文件将被忽略。

并致电:

D2

会做同样的事情,但./a.cout -rn D1 D2 中存在且D1中不存在的文件会被复制到D2

问题在于,调用D2与调用./a.out -rn不同,./a.out -nr无效,因为./a.out -r -n不是(-n)

以下是我实现主要内容的方法。

D1

2 个答案:

答案 0 :(得分:3)

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

  1. 您的短选项字符串中有一个迷路:。这使得-n可以选择吞下任何后续r。您还可以设置长选项以获取强制参数。

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

  3. 试试这个:

    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;
    }
    

答案 1 :(得分:1)

使用命令行(例如-r -n)的问题是因为您在sync的调用中对索引进行了硬编码。你不应该这样做。

如果您阅读了getopt_long手册页(当您遇到某个功能问题时总会这样做!)那么您会注意到这一行:

  

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

仔细阅读第二句话。