Создание моей оболочки: замените домашний каталог на «~» в моем приглашении. Проблема с заменой подстроки домашнего каталога

#c #shell #replace #directory #path

#c #оболочка #заменить #каталог #путь

Вопрос:

У меня проблема с попыткой сделать так, чтобы домашний каталог был «~» в приглашении для моей собственной оболочки. Я получаю каталог, связываю его со всем каталогом, но когда он найден, и я хочу изменить его на «~» для моего приглашения, вся оболочка сегментируется. Есть идеи, как изменить только домашний каталог из моего пути к каталогу на ~? Вот пример кода с memset, я также пробовал memcpy и strncpy / strcpy:

 char *prompt_line(void) {

    if(last_status == 0){
        printf("[🙂]");
        number_displayed  ;
    }
    else{
        printf("[🤮]");
        number_displayed  ;
    }
    char *username = getlogin();
    char hostname[16];
    char directory[55];

    struct passwd *pw = getpwuid(getuid());
    const char *homedir = pw->pw_dir;

    getcwd(directory, sizeof(directory));

    char *ret = strstr(directory, homedir);
    memcpy(ret, "~", 6);

    gethostname(hostname, 64);
    sprintf(prompt_str, "-[%d]-[%s@%s:%s]$", number_displayed,  username, hostname, ret);
    return prompt_str;
}
  

Комментарии:

1. Где вы объявили prompt_str ?

2. memset() создаст что-то вроде ~~~~~~~~~~~~~ , а не одно ~ .

3.Вам нужно позвонить getcwd(directory, sizeof(directory)) перед вызовом strstr() .

4. Извините, я изменил его сейчас, и он работает с самого первого раза, но после сбоя

5. Вам нужно проверить strstr() , возвращено ли значение, отличное от NULL.

Ответ №1:

memcpy(ret, "~", 6) неверно. В нем всего 2 байта "~" ( ~ символ и нулевой ограничитель), вы не можете скопировать из него 6 байт.

Вам нужно поместить результат в новую строку для объединения ~ с остальной частью каталога.

 char prompt_dir[55];
char *ret = strstr(directory, homedir);
if (ret == directory) {
    if (strcmp(directory, homedir) == 0) { // in homedir, prompt is just ~
        strcpy(prompt_dir, "~");
    } else { // in subdirectory, prompt is ~/subdir
        sprintf(prompt_dir, "~/%s", directory   strlen(homedir)   1); // skip past homedir and / character
    }
} else {
    strcpy(prompt_dir, directory);
}
gethostname(hostname, 64);
sprintf(prompt_str, "-[%d]-[%s@%s:%s]$", number_displayed,  username, hostname, prompt_dir);