C 检查文件是否存在,给定该文件的目录。如何调试?

C 检查文件是否存在,给定该文件的目录。如何调试?,c,server,C,Server,所以基本上我得到了一个目录的路径,如果它存在,我应该返回index.html,如果该文件存在,我应该返回index.php。问题是我不知道如何调试这个函数,因为我只是为一个更大的程序实现这个函数 char *indexes(const char *path) { char *newPath = malloc(sizeof(char) * strlen(path)); strcpy(newPath, path); if (access(path, F_OK)) {

所以基本上我得到了一个目录的路径,如果它存在,我应该返回
index.html
,如果该文件存在,我应该返回
index.php
。问题是我不知道如何调试这个函数,因为我只是为一个更大的程序实现这个函数

char *indexes(const char *path) {
    char *newPath = malloc(sizeof(char) * strlen(path));
    strcpy(newPath, path);

    if (access(path, F_OK)) {
        if (access("index.html", F_OK)) {
            strcat(newPath, "/index.html");
        } else
        if (access("index.php", F_OK)) {
            strcat(newPath, "/index.php");
        } else {
            return NULL;
        }
    } else {
        return NULL;
    }
    return newPath;
}

这看起来对吗?当我运行我的程序时,我得到一个错误
501未实现

,因为您要将
路径
/index.html
连接到新分配的
新路径
,您必须为空终止符至少分配长度加1个额外字节的总和:

strlen(path) + strlen("/index.html") + 1;
“/index.php”
比另一个字符串短,因此缓冲区可以处理替代连接

当前代码导致缓冲区溢出,调用未定义的行为,可能导致观察到的行为

请注意,您的代码不能像编写的那样工作:您应该在检查访问之前连接,否则您将在错误的目录中检查访问。您还应该
free(newPath)

以下是更正的版本:

char *indexes(const char *path) {
    char *newPath = malloc(strlen(path) + strlen("/index.html") + 1);

    if (newPath) {
        strcpy(newPath, path);
        strcat(newPath, "/index.html");
        if (access(newPath, F_OK)) {
            return newPath;
        }
        strcpy(newPath, path);
        strcat(newPath, "/index.php");
        if (access(newPath, F_OK)) {
            return newPath;
        }
        free(newPath);
    }
    return NULL;
}

由于要将
路径
/index.html
连接到新分配的
新路径
,因此必须至少将其分配到长度总和加上空终止符的1个额外字节:

strlen(path) + strlen("/index.html") + 1;
“/index.php”
比另一个字符串短,因此缓冲区可以处理替代连接

当前代码导致缓冲区溢出,调用未定义的行为,可能导致观察到的行为

请注意,您的代码不能像编写的那样工作:您应该在检查访问之前连接,否则您将在错误的目录中检查访问。您还应该
free(newPath)

以下是更正的版本:

char *indexes(const char *path) {
    char *newPath = malloc(strlen(path) + strlen("/index.html") + 1);

    if (newPath) {
        strcpy(newPath, path);
        strcat(newPath, "/index.html");
        if (access(newPath, F_OK)) {
            return newPath;
        }
        strcpy(newPath, path);
        strcat(newPath, "/index.php");
        if (access(newPath, F_OK)) {
            return newPath;
        }
        free(newPath);
    }
    return NULL;
}

如果不进行调试,我可以看出您没有为初始字符串副本分配足够的malloc空间,因此您将获得未定义的行为。然后你会给它添加更多的内容!!如果创建
newPath
的原因是要有一个可以追加的
path
字符串版本,那么肯定没有
malloc
足够的空间。即使没有,也没有为空终止符留出足够的空间,因此需要
sizeof(char)*(strlen(path)+1)
。(请注意,
sizeof(char)
不是必需的,因为
sizeof(char)==1
始终为真。如果不进行调试,我可以看出您没有为初始字符串副本分配足够的空间,因此您将获得未定义的行为。然后您会向其追加更多内容!!如果您返回NULL,则您正在泄漏您分配的内存。如果创建
newPath
的原因是要有一个版本的可以附加到的
path
字符串,则肯定没有
malloc
占用足够的空间。即使没有,也没有为空终止符留出足够的空间,因此需要
sizeof(char)*(strlen(path)+1)
(请注意,
sizeof(char)
,因为
sizeof(char)==1
始终为真。