c - 从文件路径反向获取目录路径

标签 c linux recursion

假设我有一个文件名/A/B/C/d.txt,

我想反向打印目录路径,

/A/B/C/
/A/B/
/A/

下面是一个使用递归来反向打印目录路径的程序。

#include <stdio.h>
#include <libgen.h>
#include <string.h>
#include <stdlib.h>

void parsepath(const char *dirpath)
{
    char* dirPathTemp;  
    char* dirname;
    char path[255];  

    dirPathTemp = strdup(dirpath);
    dirname = dirname(dirPathTemp);     
    strcpy(path, dirname);

    free(dirPathTemp);  

    printf("path = %s\n", path);    

    if (0 != strcmp(path, "/"))
        parsepath(path);
}

int main(int argc, char *argv[])
{
    parsepath("/A/B/C/d.txt");

    return 0;
}

有没有其他方法可以不用递归来做到这一点?谢谢。

最佳答案

以下算法很简单:每次在输入字符串中搜索最后一次出现的 '/' 时,将其替换为 '\0' (字符串结束标记)并打印它,继续直到路径中不再有斜杠。复制输入字符串是必要的,因为它必须就地修改:

#include <stdio.h>
#include <string.h>

void parsepath(const char *dirpath)
{
    char *p = strdup(dirpath);
    char *lastslash;
    while(lastslash = strrchr(p, '/')) {
        *lastslash = '\0';
        printf("%s\n", p);
    }
    free(p);
}

int main(void) {
    parsepath("/A/B/C/d.txt");
    return 0;
}

注意: strrchr() 从头开始​​搜索输入字符串,这不是最佳的。由于每次都需要斜杠的最后一次出现,因此向后搜索会更好。这就是 memrchr() 函数的作用。将 strrchr() 替换为 memrchr() 留给读者作为练习。

关于c - 从文件路径反向获取目录路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40216623/

相关文章:

有效地连接左侧的 N 个字符数组,C

c - 查找分配的内存

algorithm - 我陷入了我的递归

java - 有人可以解释一下这段代码吗?排列码

c++ - 如何让 2 个应用程序在 linux 中相互运行?

python - 进程完成,退出代码为 -1073741571

c - 计算字符串中空格、制表符和换行符数量的程序

ios - 是否可以获得PID的启动时间?

java - 如何在创建文件时在java中使用 '//'

c++ - Code::Blocks 调试器在 Kubuntu 上运行缓慢