Почему это не удаляет '&' в конце пользовательской команды? - PullRequest
0 голосов
/ 30 сентября 2019

Я пишу базовую оболочку на C, и я хочу, чтобы это было в том случае, если введенная команда содержит &, тогда она будет работать в фоновом режиме, и пользователь все еще сможет выполнять другие команды.

Но по какой-то причине я могу заставить программу работать в фоновом режиме, поэтому я знаю, что оператор IF работает (где он проверяет '&'), но я не могу заставить его удалить знак '&'из команды.

Вот соответствующий код, не стесняйтесь задавать вопросы:

int main(void)
{
  Command cmd;
  int n;

  while (!done) {

    char *line;
    line = readline("> ");
//This should check if 'line' contains an &, and remove it if so.
    if (strchr(line, "&") != NULL) {
      line[strlen(line) - 1] = '\0';
      char **cmds;
      cmds = separateCmd(line);

      if (!line) {
      /* Encountered EOF at top level */
        done = 1;
      } else {
        stripwhite(line);

        if(*line) {
          add_history(line);
          /* execute it */
          n = parse(line, &cmd);
          PrintCommand(n, &cmd);
          executeBgCmd(cmds);
        }
      }

        if(line) {
          free(line);
        }
    } else {
      char **cmds;
      cmds = separateCmd(line);

      if (!line) {
      /* Encountered EOF at top level */
        done = 1;
      } else {
        stripwhite(line);

        if(*line) {
          add_history(line);
          /* execute it */
          n = parse(line, &cmd);
          PrintCommand(n, &cmd);
          executeCmd(cmds);
        }
      }

      if(line) {
        free(line);
      }
    }
  }
  return 0;
}

Любая помощь будет высоко ценится. Заранее спасибо: D

1 Ответ

3 голосов
/ 30 сентября 2019

Когда я компилирую ваш код и смотрю на предупреждения, я вижу:

warning: passing argument 2 of ‘strchr’ makes integer from pointer without a cast [-Wint-conversion]

Итак, компилятор говорит мне, что ваш код неверен! Поиск strchr (например, http://man7.org/linux/man-pages/man3/strchr.3.html), Я вижу, что strchr ожидает, что вторым аргументом будет символ для поиска. Но ваш код передает строку (или, точнее, указатель на первый символstring):

if (strchr(line, "&") != NULL) {
                 ^^^
                 ups

Попробуйте вместо этого

if (strchr(line, '&') != NULL) {

Из справочной страницы я также вижу, что strchr возвращает указатель на символ, если он найден. Поэтому он можетимеет смысл написать код вроде:

char* pHit = strchr(line, '&');
if (pHit != NULL) {
  *pHit = '\0';      // Terminate string at first &
}

, чтобы & не был последним символом.

Простая тестовая программа может быть:

int main()
{
    char line[] = "hello & world";
    printf("Before: %s\n", line);
    char* pHit = strchr(line, '&');
    if (pHit != NULL) {
      *pHit = '\0';
    }
    printf("After: %s\n", line);

    return 0;
}

Выход:

Before: hello & world
After: hello
...