chdir() - нет такого файла или каталога

int main(int argc, char **argv)
{
  char input[150];
  char change[2] = "cd";
  char *directory;

  while(1) {
      prompt();
      fgets(input, 150, stdin);

      if(strncmp(change, input, 2) == 0) {
          directory = strtok(input, " ");
          directory = strtok(NULL, " ");

          printf(directory);
          chdir(directory);
          perror(directory);

      }

      if(feof(stdin) != 0 || input == NULL) {
          printf("Auf Bald!\n");
          exit(3);
      }
  }
}

когда я запускаю это и набираю «cd test», я получаю «нет такого файла или каталога». Зато есть каталог "тест".

Работает на Arch Linux.


person csczigiol    schedule 27.11.2012    source источник
comment
Проверьте свою строку directory следующим образом: printf("directory = [%s]\n", directory); на случай, если у вас есть случайный перевод строки или другие нежелательные/невидимые символы в имени.   -  person Paul R    schedule 27.11.2012
comment
char change[2] = "cd" присваивает массив размера 3 переменной размера 2. Вместо этого используйте char change[] = "cd".   -  person William Pursell    schedule 27.11.2012
comment
@WilliamPursell- На самом деле, он использует strncmp(...2), так что это законно, хотя у вас все равно хорошая практика.   -  person rodrigo    schedule 27.11.2012


Ответы (1)


На справочной странице:

fgets() считывает не более одного символа меньше size из потока и сохраняет их в буфер, на который указывает s. Чтение останавливается после EOF или новой строки. Если читается новая строка, она сохраняется в буфере.

Проблема в том, что в конце вашей строки, которую вы получили от fgets(), есть символ новой строки '\n', вам нужно удалить его:

fgets(input, 150, stdin);
input[strlen(input)-1] = '\0';

Также:

char change[2] = "cd";

Это должно быть change[3], это 2 (для "cd") + 1 для нулевого терминатора '\0', который автоматически размещается для вас.

Тогда это должно работать.

ИЗМЕНИТЬ:

Другой альтернативой является изменение вызова strtok() таким образом, чтобы:

directory = strtok(NULL, " \n");

Это будет работать, если пользователь вводит строку с помощью клавиши ввода или с помощью символа EOF (ctrl + d в Linux)... Я не уверен, насколько вероятно, что второй пользователь сделает это... но это не так. т больно!

person Mike    schedule 27.11.2012
comment
Не лучше ли написать strtok(..., " \n") на тот случай, если строка заканчивается на EOF или что-то в этом роде? - person rodrigo; 27.11.2012
comment
@rodrigo - Да, было бы лучше, если бы был EOF. Наверное, я предполагал, что пользователь наберет cd ‹имя файла› ‹клавиша ввода›, а не cd ‹имя файла› ‹ctrl + d›... но кто знает! Отредактировал ответ, чтобы покрыть это. - person Mike; 27.11.2012
comment
И зачем ограничиваться " \n", а не " \t\n\r", просто так? - person rodrigo; 27.11.2012