从文件path反向获取目录path

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

我想要反向打印目录path,

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

下面是一个使用recursion来反向打印目录path的程序。

 #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; } 

有没有其他的方式来做这个没有recursion? 谢谢。

下面的算法很简单:每次搜索输入字符串的最后一次出现'/' ,用'\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()函数的作用。 用memrchr()代替memrchr()作为读者的练习。