Ошибка сегментации, когда я меняю каталог в C - PullRequest
0 голосов
/ 01 февраля 2020

Я хочу создать программу, которая имитирует использование CD в UNIX. Очевидно, что лучший вариант - chdir. Однако, когда пользователь вводит cd /home, я получаю Segmentation fault. Когда я использую GDB, он печатает:

Program received signal SIGSEGV, Segmentation fault. __rawmemchr_avx2 () at ../sysdeps/x86_64/multiarch/memchr-avx2.S:61
61  ../sysdeps/x86_64/multiarch/memchr-avx2.S: The file of directory does not exist.

Код выглядит так:

void cd(char buff[]){
     if(chdir(buff)==-1){
          printf("Problem with directory\n");
     }
}

int main(int argc, char *argv[]){
    char* token;
    char buffer[256];

    printf("Welcome user\n");
    sscanf("%s",buffer);
    token=strtok(buff," ");
    if(strcmp(token,"cd")==0||strcmp(token,"cd\n")==0){
        cd(strtok(NULL," ");
    }

    return 0;
}

Чем вы потратили время.

Ответы [ 2 ]

0 голосов
/ 01 февраля 2020

У этого кода есть несколько проблем:

1), даже если sscanf поменялся местами на scanf, он не будет делать то, что вы, вероятно, ожидаете (прочитайте всю строку, вставленную пользователем). scanf с %s будет считывать до первого пробела. Таким образом, ваш буфер будет содержать cd\0 вместо cd /home\0, как вы ожидаете. Вместо этого используйте fgets.

2) Необходимо убедиться, что strtok не возвращает указатель NULL. Это то, что в настоящее время вызывает ваш segfault.

Примерно так:

void cd(char buff[]) {
     if(chdir(buff) == -1) {
          printf("Problem with directory\n");
     }
}

int main(int argc, char *argv[]){
    char* token;
    char buffer[256];

    printf("Welcome user\n");
    // reads the whole line into buffer
    fgets(buffer, 256, stdin);
    token = strtok(buffer, " ");

    if (strcmp(token, "cd") == 0){
        token = strtok(NULL," ");
        // we must check if there are any tokens left
        if (token != NULL) {
            // we must remove the trailing newline character that is included by fgets
            cd(strtok(token, "\n"));
        }
    }

    return 0;
}
0 голосов
/ 01 февраля 2020

Вы допустили несколько синтаксических c и логических ошибок внутри предоставленного кода, например, buff вместо buffer в main() и sscanf вместо scanf для предоставления входной строки.

Кроме того, вы написали cd(strtok(NULL," ");, но для этого оператора для компиляции отсутствует закрывающая скобка: cd(strtok(NULL," "));.

Я исправил код, и выходной файл работает нормально на моей платформе - с G CC в Ubuntu GNU / Linux.

Вот исправленный код:

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

void cd(char buff[]){
     if(chdir(buff)==-1){
          printf("Problem with directory\n");
     }
}

int main(int argc, char *argv[]){
    char* token;
    char buffer[256];

    printf("Welcome user\n");
    scanf("%s",buffer);
    token=strtok(buffer," ");
    if(strcmp(token,"cd")==0||strcmp(token,"cd\n")==0){
        cd(strtok(NULL," "));
    }

    return 0;
}

Попробуйте это с этим.

...