2016-01-17 2 views
0

Я знаю, что означает эта ошибка, но я не вижу, что я сделал не так. Я реализовал функцию для удаления файлов и каталогов, а также хочу реализовать «-i» для команды «rm». Используемая команда: rm -i filename.Сбой приложений с ошибкой сегментации

Меня спрашивают, хочу ли я удалить его, я набираю «y», файл, который я хочу удалить, получает deteleted, но программа падает после этого, и я не знаю почему.

int has_args(char * argv[], char arg[]) 
{ 
    int i = 0; 

    while(argv[i] != NULL) { 

     if(strcmp(argv[i], arg) == 0) { 
      return 1; 
     } 
     i++; 
    } 
    return 0; 
} 

void print_error(char *this, char *filename) 
{ 
    fprintf(stderr, "%s: Could not delete file: %s;\n%s\n", this, filename, strerror(errno)); 
} 

int cmd_rm(int argc, char *argv[]) 
{ 
    errno = 0; 

    if(argc > 1) { 
     if(has_args(argv, "-r")) { 
      remove_directory(argv[2]); 
     } 
     else if(has_args(argv, "-i")) { 

      char ans[2]; 

      fprintf(stdout, "Delete file: '%s'?\n", argv[2]); 
      scanf("%s", ans); 
      trim(ans); 

      if((ans[0] == 'Y') || (ans[0] == 'y')) { 

       if(remove(argv[2])) { 
        print_error(argv[0], argv[2]); 
       }  
      } 
     } 
     else { 
      if(remove(argv[1])) { 
       print_error(argv[0], argv[1]); 
      } 
     } 
    } 
    else { 
     puts("ERROR: "); 
     print_usage(argv[0]); 
    } 

    return 0; 
} 
+0

Что такое 'has_args()'? И почему вы предполагаете, что второй аргумент - '-i', а не первый? –

+0

Потому что -i всегда будет вторым аргументом. Первый будет «rm», второй будет «-i», а третий будет файлом, который я хочу удалить. –

+0

Но вы не можете гарантировать это, и если это всегда будет, нет никакого смысла в проверке. То, что вы делаете, не имеет смысла. Просто перейдите в массив 'argv' и проверьте, какой вариант он есть. –

ответ

0

Почему бы вам не попробовать scanf("%c",&ch); в качестве ответа, если пользователь может ввести только y или n, однако, если вы хотите поддержать yes или no вы можете написать следующий код:

scanf("%1,3s",ans); /* Points out that the minimum length is 1 and the maximum length is 3 */ 

и как указывали другие, в некотором случае функция cmd_rm() должна возвращать 1 или любое другое значение для указания успеха в деле удаления файла. Однако я не вижу никакого примера успеха в вашей функции cmd_rm(), и было бы лучше, если бы вы включили функцию trim.

Но в целом Segmentation faults связаны с указателями, не указывающими на правильное положение (сложные указатели). Отладчики удобны в поиске этих указателей.

+0

Ну, это не сработало Я изменил «char ans [256];», и я попытался выполнить сканирование, как и вы, но при компиляции я получаю предупреждение: «Формат«% c »ожидает аргумент типа« char * », но аргумент 2 имеет тип« char » (*) [256] '", и он по-прежнему сбой –

+0

. Вы можете отлаживать и размещать здесь все функции, чтобы мы могли вам помочь. –

+0

Я думаю, что в этом фрагменте вашего кода нет проблем с' Segmentation Fault', поэтому опубликуйте все ваш код –

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