Как изменить регистр в зависимости от используемой опции - PullRequest
0 голосов
/ 08 июля 2019

Я пытаюсь добавить параметры для моего менеджера пакетов (например, -a, -d, -i и т. Д.) И не могу изменить регистр. Как изменить регистр в зависимости от того, какой из них передан (IE: creep -a firefox)?

Я писал менеджер пакетов и сейчас пытаюсь настроить основной файл c. В этом файле я запускаю определенные функции в зависимости от того, какую опцию вы передаете, например, если вы хотите установить пакет, вы запустите creep -a <package>, который вызовет функции connection.c и add.c. Мне трудно заставить дело измениться. Основной файл c (или creep.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 Ответ

1 голос
/ 08 июля 2019
  1. Чтобы ответить на ваш главный вопрос об использовании операторов switch с аргументами программы:
    Я бы порекомендовал заглянуть в getopt (3). Страница man содержит хорошую документацию и примеры, а библиотека проста в использовании и довольно широко используется в проектах * nix.

  2. Чтобы понять, почему сравнение строк не работает, проверьте возвращаемое значение.

  3. Чтобы понять, почему вы не можете установить значение option на argv[i], помните, что аргумент функции char *var[] функционально эквивалентен char **var, поэтому вы по сути пытаетесь установить символ из указателя символа.

...