Функция C realpath не работает для строк, определенных в исходном файле.

У меня странная проблема с функцией realpath. Функция работает, когда ей передается строка, полученная в качестве аргумента для программы, но происходит сбой, когда передается строка, которую я определяю в исходном коде. Вот простая программа:

#include <stdlib.h>
#include <limits.h>
#include <stdio.h>

int main(int argc, const char* argv[])
{
    char* fullpath = (char*)malloc(PATH_MAX);
    if(realpath(argv[1], fullpath) == NULL)
    {
        printf("Failed\n");
    }
    else
    {
        printf("%s\n", fullpath);
    }
}

Когда я запускаю это с аргументом ~/Desktop/file (file существует и является обычным файлом), я получаю ожидаемый результат

/home/<username>/Desktop/file

Вот еще одна версия программы:

#include <stdlib.h>
#include <limits.h>
#include <stdio.h>

int main(int argc, const char* argv[])
{

    const char* path = "~/Desktop/file";

    char* fullpath = (char*)malloc(PATH_MAX);
    if(realpath(path, fullpath) == NULL)
    {
        printf("Failed\n");
    }
    else
    {
        printf("%s\n", fullpath);
    }
}

Когда я запускаю эту программу, я получаю вывод

Failed

Почему второй не работает?


person Jona    schedule 01.06.2017    source источник
comment
Не имеет отношения к вашему вопросу, но почему вы выделяете fullpath динамически? Почему не массив?   -  person Some programmer dude    schedule 01.06.2017
comment
Что касается вашей проблемы, вы пробовали распечатать argv[1], чтобы узнать, что это такое? И проверять errno при сбое вызова? Я также предлагаю вам прочитать страницу руководства realpath.   -  person Some programmer dude    schedule 01.06.2017


Ответы (2)


const char* path = "~/Desktop/file";

символ тильды (т.е.: ~) не расширяется (т.е. не заменяется путем к вашему домашнему каталогу) в вашей программе.

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

person 眠りネロク    schedule 01.06.2017

Оболочка расширяет ~ до правильного имени перед запуском программы, и это то, что находится в argv[1].

Когда он жестко закодирован, он, очевидно, не автоматически расширяет имя для вас.

person lostbard    schedule 01.06.2017