【问题标题】:Combine options with arguments getopt将选项与参数结合使用 getopt
【发布时间】:2013-12-22 23:24:28
【问题描述】:

你好,我正在编写一个程序,该程序从 c 中的命令行接收多个选项。这些是一些选项:

-l   counts number of lines in file
-w   counts words in file
-c   counts characters in file

为了让它们发挥作用,你可以这样做:

./program -l file.txt
./program -w file.txt
./program -c file.txt

但是我想将它们组合起来,以便多个选项仍然可以正常工作。例如:

./program -lwc file.txt

将计算行数、单词数和文件数,

./program -lw file.txt

将计算行数和字数,

./program -cl file.txt

将计算字符和行等。我只是不知道如何做到这一点。这是我的参数代码:

while ( ( c = getopt( argc, argv, "c:w:l:" ) ) != -1 ) { /* get options */
    switch ( c ) {
        case 'c':
            cflag = 1;
            break;
        case 'w':
            wflag = 2;
            break;
        case 'l':
            lflag = 3;
            break;
    }   
}

它只是简单地改变选项,但它仍然不起作用。使用我现在拥有的代码,结合两个选项会导致段错误。任何帮助表示赞赏

【问题讨论】:

  • 您应该使选项不带参数,然后在选项处理完成时读取文件名(当getopt 返回-1 时)。为此使用optind
  • 谢谢你,这很简单,我搞定了。

标签: c linux command-line gnu getopt


【解决方案1】:

getopt 格式的 : 用于带有参数的选项。删除它们。

【讨论】:

    【解决方案2】:

    正如 Jens Gustedt 所说:从选项中删除冒号,使它们不带参数。然后,完成选项处理时(即getopt 987654322 @),检查optind = 987654324 @ ince有一个额外的参数(你的文件名)。像这样:

    /* after the while-loop */
    if(optind < argc){
        fileName = argv[optind];
        optind++;
    }else{
        perror("No file specified");
        return -1;
    }
    

    getopt 完成时,optind 指向argv 中未被getopt 处理的第一个条目。

    【讨论】:

      猜你喜欢
      • 2012-08-05
      • 2014-03-22
      • 1970-01-01
      • 2013-11-05
      • 2021-12-27
      • 2021-06-24
      • 2013-03-06
      • 1970-01-01
      相关资源
      最近更新 更多