Обрезка конечного \ 0 из fgets () в c

Я пишу простую программу оболочки на C, где программа принимает команды от пользователя в командной строке, токенизирует ввод в массив, а затем использует функцию execvp () для выполнения пользовательских команд. Чтобы прочитать ввод пользователя, я использую функцию fgets ():

char command[MAX];
fgets(command, MAX, stdin);

Теперь вот где моя проблема (и я очень новичок в программировании на C). Если пользователь вводит, например, ls -af, и я проверяю длину набранной строки, например

strlen(command)

результат - 7, хотя набрано всего 6 символов. Я понимаю, что это потому, что fgets () всегда добавляет \ 0 в конец строки. Однако позже это вызовет проблемы для моей программы. Я токенизирую ввод с помощью функции strtok () следующим образом:

char* token;
int i = 0;
char* args[10];
token = strtok(command, " ");
while(token != NULL)
  {   
      args[index] = token;
      token = strtok(NULL, " ");
      index ++ ;
   }
  args[index] = NULL;

После этого последний элемент в массиве args перед NULL (в данном случае -af) сохраняет завершающий \ 0, созданный функцией fgets (). Это, в свою очередь, вызывает проблему для моего вызова execvp (), поскольку он не распознает последний элемент в массиве. Я предполагаю, что он читается как -af \ 0, тогда как он должен быть просто -af. Есть ли способ обрезать последний \ 0, созданный функцией fgets (), или есть более простой способ прочитать ввод от пользователя? Заранее спасибо!

strlen - это нет, считая терминатор \0. Вероятно, вы видите символ новой строки \n.
Eugene Sh. 13.09.2018 19:13

Итак, как я могу обрезать его, чтобы он не отображался в токенизированном массиве?

Alexander Nenartovich 13.09.2018 19:14

Прямо там, во втором комментарии ...

Eugene Sh. 13.09.2018 19:15

После добавления вышеуказанного оператора я получаю сообщение об ошибке компиляции «команда не может быть решена». Мне нужно что-то # включить? Извините, ребята, и еще раз спасибо за вашу помощь.

Alexander Nenartovich 13.09.2018 19:21
command уже используется в вашем коде, поэтому, если вы получаете команда не может быть решена, вы поместили его не в то место. Трудно сказать вам, где вы ошиблись После добавления приведенного выше утверждения, потому что мы не можем видеть ваш экран отсюда, чтобы увидеть, что вы сделали, когда добавили указанное выше утверждение.
Ken White 13.09.2018 19:24

функция: strcspn() находится в заголовочном файле: string.h

user3629249 13.09.2018 19:33

Спасибо вам всем, ребята, теперь это работает! Я бы хотел, чтобы некоторые из вас опубликовали ответ, чтобы я мог проголосовать за вас. Еще раз спасибо!

Alexander Nenartovich 13.09.2018 19:36
2
7
156
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как указано в комментариях выше, вы, вероятно, видите, что новая строка сохраняется в строке.

Чтение MAN (3) страница для фэтов (выделено мной):

fgets() reads in at most one less than size characters from stream and stores them into the buffer pointed to by s. Reading stops after an EOF or a newline. If a newline is read, it is stored into the buffer. A terminating null byte ('\0') is stored after the last character in the buffer.

Если вы хотите удалить символы новой строки, вы можете увидеть эта почта, в котором есть ответ, предлагающий использовать что-то вроде этого:

buffer[strcspn(buffer, "\n")] = 0;

@AlexanderNenartovich - Приятно слышать! Если мой ответ помог, не забудьте проголосовать и принять :)

Addison 19.09.2018 08:51

Другие вопросы по теме