strtok возвращает ноль в конце

Я пишу оболочку с командой «эхо». Например, если пользователь вводит «echo hello world», оболочка выводит «hello world».

Мой код ниже.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {

  int MAX_INPUT_SIZE = 200;
  char input[MAX_INPUT_SIZE];
  char *command;

  printf("shell> ");
  fgets(input, MAX_INPUT_SIZE, stdin);

  //find first word
  char *space;
  space = strtok(input, " ");
  command = space;

  // printf("command: %s\n",command);

  //echo command
  if (strncmp(command, "echo", MAX_INPUT_SIZE) == 0) {
    while (space != NULL) {

      space = strtok(NULL, " ");
      printf("%s ", space);
    }

    }

  return (EXIT_SUCCESS);

}

Когда я запускаю это, с вводом

echo hello world

оболочка распечатывает

hello world
 (null)

Я не понимаю, почему печатается (null). Любые идеи?

Спасибо заранее за ваше время!


person IrateIrish    schedule 12.09.2013    source источник


Ответы (2)


Исправьте, как показано ниже: -

if (strncmp(command, "echo", MAX_INPUT_SIZE) == 0) {
   space = strtok(NULL, " "); //eat the "echo"
    while (space != NULL) {
       printf("%s ", space);                         <----+
      space = strtok(NULL, " ");                          |     
//      printf("%s ", space);                        -----+
    }

    }
person P0W    schedule 12.09.2013
comment
Нужно будет что-то сделать, чтобы изначально не печатать echo. Может быть, добавить space = strtok(NULL, " "); между if и while. - person Macattack; 12.09.2013
comment
@POW Спасибо, это сработало. Однако с этим исправлением в следующей строке перед приглашением командной строки печатается пробел. Есть ли способ исправить это? - person IrateIrish; 12.09.2013
comment
@ flexcalibur6 Если я прав, похоже, вы используете терминал Linux. Я не могу проверить, что я на Windows. Что вы, вероятно, можете сделать, так это поставить printf("\n"); непосредственно перед return main. Этот пробел появляется из-за завершающего пробела от printf("%s ", space); - person P0W; 12.09.2013
comment
@POW Это исправление настолько простое, что я немного смущен, что не подумал об этом. Благодарю вас! - person IrateIrish; 12.09.2013

Вам не хватает space = strtok(NULL, " "); в начале цикла while.

По моему опыту, использование цикла while имеет следующую структуру:

doA();
while(checkA()) {
  doA();
}
person Freddie    schedule 12.09.2013
comment
Я думаю, вы ищете цикл do-while. Цикл while никогда не должен выглядеть так. - person Matt Bryant; 15.09.2013