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
始终为真。