c - 在命令行程序中将选项与非选项参数分开

标签 c command-line

我正在尝试编写带有一些选项的 ls 的限制版本。

但是,我一直坚持以一种干净的方式从我的参数中解析出我的选项的问题。

例如:

$ ls -l -t somefile anotherFile

$ ls somefile -lt anotherFile

具有相同的行为。

这给我带来了两个问题:

  1. 这让 argc 的使用变得有点困难。例如,我会考虑参数 ls -ltls 都有 0 个参数(命令名称除外)但是 argc 计数 -l 作为参数。

因此天真的实现:

if( argc == 1) {list all the contents of cwd}

不起作用。

是否有内置方法来获取选项以及选项计数,还是我必须推出自己的函数?

  1. 我必须考虑可以安排选项的所有不同方式,并注意不要将选项混淆为文件名或目录名。看起来最干净的解决方案是从一开始就将选项与文件参数分开。有没有一种惯用的方法可以做到这一点/是否有标准库调用可以做到这一点?

最佳答案

没有内置的参数解析帮助,但是getopt是参数解析的“标准”方法。

对于简单的应用程序,我有时会自己推出类似的东西:

int pos=0;
argc--;argv++;
while (argc > 0) {
  if (*argv[0]=='-') {
     switch ((*argv)[1]) {
       case 'l': //-l argument
         save_option_l(++argv);
         argc--; //we consumed one name
         break;
       //... other -options here ...
       default:
         usage("unrecognized option %s", *argv);   
     }
   }
   else {
     save_positional_argument(argv,pos++);
   }
   argv++;
   argc--;
}

在这种情况下,我要求修饰符直接跟在标志之后。不要像您的第一个示例那样支持变量使用,除非有非常充分的理由这样做。

关于c - 在命令行程序中将选项与非选项参数分开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50342378/

相关文章:

c - 导致 StrCmp 返回 0 的非 Null 终止值?

c - 如何在c中的递归算法中通过引用传递参数?

C - 增加一个字符内的数字

c - 我如何使用 sscanf 接受零作为输入,但不接受非数字输入?

linux - 去路径然后 tar ?

command-line - 从命令行打开另一个IntelliJ IDEA项目

c - 从子进程检索 PID 和退出状态

arrays - C 代码在字符串中删除不区分大小写的子字符串时出现问题

c++ - 来自终端的base64编码字符串?

php - PHP 中的退出状态仅在从命令行运行时有用吗?