C目录遍历 - 打印目录名称不应该

时间:2013-10-14 21:15:21

标签: c

这可能只是一个语法问题,我做错了,但我不能为我的生活弄清楚,所以我道歉,如果这也是“嘿我为我调试代码!”

相关代码:

struct dirent *readDir;
DIR *dir;
dir = opendir(name);

if(dir == NULL) {
    printf("No directory found with the name %s\n", name);
} else {
    printf("directory named %s opened.\n", name);

    while((readDir = readdir(dir)) != NULL) {
        if(readDir->d_name != ".." || readDir->d_name != ".") {
            printf("%s\n", readDir->d_name);
        }
    }
    closedir(dir);
}

while循环中的if条件似乎不起作用,这是它产生的输出:

directory named test opened.
file2
.
test2
file1
..

如果我没有误会,if语句应该过滤掉。和..目录,但它没有。这样做的目的是成为一个递归目录遍历,但除非我能阻止它递归到。和..目录我无法继续前进。

基本上,我不知道怎么做字符串比较我猜?

2 个答案:

答案 0 :(得分:5)

C不支持'!='或'=='进行字符串比较。使用strcmp();

if(readDir->d_name != ".." || readDir->d_name != ".") {

应该是

if(strcmp(readDir->d_name, "..") && strcmp(readDir->d_name, ".")) {
    // d_name is not "." or ".."
}

答案 1 :(得分:2)

以下是两个问题:

if(readDir->d_name != ".." || readDir->d_name != ".") {

首先,您无法在C中以这种方式比较字符串...您实质上是在检查字符串文字的地址是否与readDir->d_name中的地址匹配。您需要使用strcmp()之类的函数。

其次,当你或者像这样的条件时,只需要一个是真的使整个表达式成为真...而且d_name不能等于“......”和“。”同时,即使字符串比较 正如您(可能)所期望的那样,整体表达式也始终为TRUE。

所以你需要这样的东西:

if (strcmp("..", readDir->d_name) && strcmp(".", readDir->d_name)) {

(因为当{em>不匹配时,strcmp()返回非零值,并且您需要匹配两个字符串。)