分段错误检查 strcmp
Segmentation fault checking strcmp
我正在编写一个函数 next_node
来查找目录中的下一个文件。节点将目录和文件名作为输入。
如果 bname
之后没有其他文件或者是 "."
或 ".."
,我希望它成为 return NULL
。仅当它在 strcmp
.
的 if
语句中运行时才给我 segmentation fault (core dumped)
能否解释一下问题或给出解决方案?
代码:
#include <stdio.h>
#include <dirent.h> // DIR opendir() closedir() struct dirent readdir()
#include <string.h> // strcmp()
char *next_node(char *dname, char *bname) {
if (!strcmp(dname, bname)) {
// dname same as bname
return NULL;
}
DIR *dirp = opendir(dname);
struct dirent *direntp;
while (((direntp = readdir(dirp)) != NULL) && (strcmp(direntp->d_name, bname))) {
}
if ((direntp = readdir(dirp)) != NULL) {
// if d_name is "." or ".." return NULL
if ((strcmp(direntp->d_name, ".")) || (strcmp(direntp->d_name, ".."))) {
return NULL;
}
// it can reach here with no problem
closedir(dirp);
return direntp->d_name;
} else {
closedir(dirp);
return NULL;
}
}
int main() {
char *dname = ".";
char *bname = "test.c";
char *result = next_node(dname, bname);
printf("%s\n", result);
return 0;
}
strcmp returns 0 如果它们之间没有区别,请尝试以下方法
if (strcmp(dname, bname)) {
return NULL;
}
编辑:我也不确定你的问题是我在 windows 上使用 gcc 编译这个,我没有遇到任何问题。
你有五个错误。
1:
DIR *dirp = opendir(dname);
你不检查这个 opendir
是否成功。
2:
struct dirent *direntp;
while (((direntp = readdir(dirp)) != NULL) && (strcmp(direntp->d_name, bname))) {
}
if ((direntp = readdir(dirp)) != NULL) {
这里,你调用 readdir
,即使之前的循环因为 readdir
returned NULL
而终止。你想要:
if ((direntp != NULL) && ((direntp = readdir(dirp)) != NULL)) {
3:
if ((strcmp(direntp->d_name, ".")) || (strcmp(direntp->d_name, ".."))){
将整数转换为布尔值等同于询问它是否不为零。 strcmp
函数 return 在一场比赛中为零。所以问它是否不为零就是问它是否 not 匹配。但是一切都不是“。”的匹配项。或不匹配“..”!你想要:
if ((!strcmp(direntp->d_name, ".")) || (!strcmp(direntp->d_name, ".."))){
4:
// it can reach here with no problem
closedir(dirp);
return direntp->d_name;
您刚刚 return 将指针指向您关闭的目录,使指针无效。您需要确定 returned 指针的寿命应该是多少,并可能分配一些内存给 return.
也许:
char *ret = strdup (dirent->d_name);
closedir(dirp);
return ret;
请注意,调用者需要 free
returned 字符串完成后。
5:
char *result = next_node(dname, bname);
printf("%s\n", result);
如果 result
是 NULL
,这将失败。尝试:
char *result = next_node(dname, bname);
printf("%s\n", (result == NULL) ? "NULL" : result);
(代表OP发表).
更新:问题是在 main 中打印 NULL。打印 NULL 只会在 Linux 中出现段错误,但不会在 Windows.
中出现
我正在编写一个函数 next_node
来查找目录中的下一个文件。节点将目录和文件名作为输入。
如果 bname
之后没有其他文件或者是 "."
或 ".."
,我希望它成为 return NULL
。仅当它在 strcmp
.
if
语句中运行时才给我 segmentation fault (core dumped)
能否解释一下问题或给出解决方案?
代码:
#include <stdio.h>
#include <dirent.h> // DIR opendir() closedir() struct dirent readdir()
#include <string.h> // strcmp()
char *next_node(char *dname, char *bname) {
if (!strcmp(dname, bname)) {
// dname same as bname
return NULL;
}
DIR *dirp = opendir(dname);
struct dirent *direntp;
while (((direntp = readdir(dirp)) != NULL) && (strcmp(direntp->d_name, bname))) {
}
if ((direntp = readdir(dirp)) != NULL) {
// if d_name is "." or ".." return NULL
if ((strcmp(direntp->d_name, ".")) || (strcmp(direntp->d_name, ".."))) {
return NULL;
}
// it can reach here with no problem
closedir(dirp);
return direntp->d_name;
} else {
closedir(dirp);
return NULL;
}
}
int main() {
char *dname = ".";
char *bname = "test.c";
char *result = next_node(dname, bname);
printf("%s\n", result);
return 0;
}
strcmp returns 0 如果它们之间没有区别,请尝试以下方法
if (strcmp(dname, bname)) {
return NULL;
}
编辑:我也不确定你的问题是我在 windows 上使用 gcc 编译这个,我没有遇到任何问题。
你有五个错误。
1:
DIR *dirp = opendir(dname);
你不检查这个 opendir
是否成功。
2:
struct dirent *direntp;
while (((direntp = readdir(dirp)) != NULL) && (strcmp(direntp->d_name, bname))) {
}
if ((direntp = readdir(dirp)) != NULL) {
这里,你调用 readdir
,即使之前的循环因为 readdir
returned NULL
而终止。你想要:
if ((direntp != NULL) && ((direntp = readdir(dirp)) != NULL)) {
3:
if ((strcmp(direntp->d_name, ".")) || (strcmp(direntp->d_name, ".."))){
将整数转换为布尔值等同于询问它是否不为零。 strcmp
函数 return 在一场比赛中为零。所以问它是否不为零就是问它是否 not 匹配。但是一切都不是“。”的匹配项。或不匹配“..”!你想要:
if ((!strcmp(direntp->d_name, ".")) || (!strcmp(direntp->d_name, ".."))){
4:
// it can reach here with no problem
closedir(dirp);
return direntp->d_name;
您刚刚 return 将指针指向您关闭的目录,使指针无效。您需要确定 returned 指针的寿命应该是多少,并可能分配一些内存给 return.
也许:
char *ret = strdup (dirent->d_name);
closedir(dirp);
return ret;
请注意,调用者需要 free
returned 字符串完成后。
5:
char *result = next_node(dname, bname);
printf("%s\n", result);
如果 result
是 NULL
,这将失败。尝试:
char *result = next_node(dname, bname);
printf("%s\n", (result == NULL) ? "NULL" : result);
(代表OP发表).
更新:问题是在 main 中打印 NULL。打印 NULL 只会在 Linux 中出现段错误,但不会在 Windows.
中出现