C realpath函数不适用于源文件中定义的字符串

时间:2017-06-01 15:08:44

标签: c linux 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/filefile存在并且是常规文件)运行时,我得到预期的输出

/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

为什么第二个失败?

2 个答案:

答案 0 :(得分:6)

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

代字号(即:~)未被展开(ei:替换为主目录的路径)在你的程序中。

当您在命令行中将其作为参数提供时,就像在第一个程序中一样,它是由shell扩展

答案 1 :(得分:1)

shell在运行程序之前将〜扩展为正确的名称,这就是argv [1]中的内容。

当硬编码时,显然不是为你自动扩展名称。