从文件路径

时间:2016-10-24 10:52:59

标签: 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;
}

如果没有递归,有没有其他方法可以做到这一点?感谢。

1 个答案:

答案 0 :(得分:4)

以下算法很简单:每次搜索输入字符串以查找'/'的最后一次出现时,将其替换为'\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()留给读者练习。