2015-04-24 1 views
2

Я не могу заставить эту функцию работать, потому что по какой-то причине opendir не будет принимать buffer2 (объявленный как char buffer2 [128]) в качестве аргумента правильно. Если я заменил переменную чем-то вроде «.». или «образец», он отлично работает. Но делая это так, я получаю ошибку сегментации каждый раз. Пожалуйста помоги.opendir не будет принимать строковую переменную, но будет принимать простую строку

  system("clear"); 
      DIR *dirp; 
      struct dirent *dp; 
      printf("Enter directory name: "); 
      fgets(buffer2, 100, stdin); 
      if((dirp = opendir(buffer2)) == NULL) 
       printf("Could not open directory\n"); 
      while((dp = readdir(dirp)) != NULL) 
       printf("%s\n", dp->d_name); 
      closedir(dirp); 

      printf("Hit enter to return to selection."); 
      getchar(); 
+1

Try поставить время цикла и closedir в случае блока – Morb

+1

строк читать с помощью 'fgets' сохранить символ новой строки в конце. Попробуйте удалить его с помощью 'strtok (buffer2," \ n ")' после прочтения. Вы также должны проверить возвращаемое значение 'fgets'. –

+0

Вы пробовали 'strcpy (buffer2,". ")' Или подтвердить, что это факт, что вы используете буфер, который является проблемой, а не содержимым буфера? – John3136

ответ

3

char * fgets (char * str, int num, FILE * stream);

fgets() Считывает символы из потока и сохраняет их как строку C в str до тех пор, пока не будут прочитаны символы (num-1) или не будет достигнута новая линия или конечный файл, в зависимости от того, что произойдет раньше.

Символ новой строки заставляет fgets останавливать чтение, но считается действительным символом функции и входит в строку, скопированную на str.

Конечный символ нуль автоматически добавляется после символов, скопированных на str.

Поэтому вам необходимо удалить это имя \n из имени файла, а затем передать его opendir() для дальнейшего процесса.


 system("clear"); 
     DIR *dirp; 
     struct dirent *dp; 
     printf("Enter directory name: "); 
     fgets(buffer2, 100, stdin); 

     // Lets remove tailing \n from buffer2 
     strtok(buffer2, "\n"); 

     if((dirp = opendir(buffer2)) == NULL) 
      printf("Could not open directory\n"); 
     else { 
     while((dp = readdir(dirp)) != NULL) 
      printf("%s\n", dp->d_name); 
     closedir(dirp); 
     } 

     printf("Hit enter to return to selection."); 
     getchar(); 

когда opendir вызов прибудет не может вам не нужно идти с readdir так положить, что участие в еще

+0

В качестве альтернативы, вы можете использовать 'scanf' с'% s'. Это останавливается в любом пробеле и не помещает его в буфер. – kaylum

+0

@AlanAu Scanf не будет занимать место, и пространство может находиться там в dirname, и с помощью scanf вам нужно использовать fflush (stdin), чтобы очистить этот лишний символ \ n, поэтому лучше использовать fgets() –

+1

@ mr-32 Вы правы. Хорошие моменты. – kaylum

Смежные вопросы