如何根据使用的选项更改大小写

时间:2019-07-07 21:09:09

标签: c options argv

我正在尝试为我的软件包管理器添加选项(例如-a,-d,-i等),但无法更改大小写。如何根据通过的大小写更改大小写(即:Cree -a firefox)?

我一直在编写程序包管理器,现在正在尝试设置主c文件。在此文件中,我根据您通过的选项运行特定功能,例如,如果您要安装要运行的软件包creep -a <package>,则将调用函数connection.cadd.c。我很难改变情况。主C文件(或Cree.c)当前包含以下内容:

#include <stdio.h>
#include "connection.c"

#include "add.c"

int main(int argc, char *argv[])
{
        short i;
        char option;

        option = 'a';

        switch(option) {
        case 'a':
        printf("a used\n");
        connection();
        break;

        case 'd':
        printf("d used\n");
        break;

        default:
        printf("usage: creep [-ad]\n");
        }
}

此刻,我只是使用print语句来确保一切正常。我仔细检查了一下进行调试,发现option = 'a'始终处于运行状态,因此它将始终运行case 'a',但是我不知道如何进行更改。我确实尝试过option = argv[i],但是出现了以下错误:

creep.c:11:9: warning: incompatible pointer to integer conversion assigning to 'char' from 'char *'; dereference with * [-Wint-conversion]
        option = argv[i];
               ^ ~~~~~~~
                 *
1 warning generated.

因此,我进行了一些搜索,发现了一个堆栈溢出帖子,内容涉及有关在某些情况下使用字符的情况,在这种情况下,告诫张贴者不要使用大小写,而是使用if / else。所以我确实尝试了这个,并得到了:

#include <stdio.h>
#include "connection.c"

#include "add.c"

int main(int argc, char *argv[])
{
        short i;

        for (i = 1; i < argc; i++) {
                if (strncmp(argv[i], "-a", 100))
                        printf("using a\n");
        }
}

但是,这也不起作用。然后,我决定看一些参考代码,看一下Plan9base ls,他们做选择的方式如下


void
main(int argc, char *argv[])
{
  int i;

  Binit(&bin, 1, OWRITE);
  ARGBEGIN{
  case 'F': Fflag++; break;
  case 'd': dflag++; break;
  case 'l': lflag++; break;
  case 'm': mflag++; break;
  case 'n': nflag++; break;
  case 'p': pflag++; break;
  case 'q': qflag++; break;
  case 'Q': Qflag++; break;
  case 'r': rflag++; break;
  case 's': sflag++; break;
  case 't': tflag++; break;
  case 'u': uflag++; break;
  default:  fprint(2, "usage: ls [-dlmnpqrstuFQ] [file ...]\n");
      exits("usage");
  }ARGEND

但是,这似乎不适用于我的代码库。我将如何提供适当的选择?我似乎无法为我的一生解决这个问题。

1 个答案:

答案 0 :(得分:1)

  1. 回答有关使用带程序参数的switch语句的主要问题:
    我建议研究getopt(3)。手册页上有很好的文档和示例,该库易于使用,并且在* nix项目中具有广泛的用途。

  2. 要了解为什么字符串比较无法正常工作,请检查返回值。

  3. 要了解为什么不能将option的值设置为argv[i],请记住char *var[]的函数参数在功能上等效于char **var,因此,您实质上是在尝试从char指针设置char。