给出路径
/level1/level2/level3/level4
我希望能够分割这个字符串,以便我可以检索每个单独的条目,
即" level1"," level2"," level3"," level4"。
现在我的第一个想法是使用strtok
,但显然大多数人都建议使用此功能反对。另一种方法是什么,以便我可以传入string (char* path)
并将每个条目拆分为" /"。
答案 0 :(得分:4)
strtok
是标记字符串的首选方法。你只需要知道:
如果您不想修改原始字符串,请使用strdup
制作副本并处理副本,然后根据需要复制结果。如果您需要担心多个线程或交错使用,请使用strtok_r
而不是其他状态参数。
答案 1 :(得分:3)
拆分Unix路径不仅仅是拆分/
。这些都指的是相同的路径......
/foo/bar/baz/
/foo/bar/baz
/foo//bar/baz
与许多复杂任务一样,最好不要自己动手,而是使用现有功能。在这种情况下,有POSIX dirname
和basename
函数。
dirname
返回文件路径中的父路径basename
返回文件路径的最后一部分将它们结合使用,可以拆分Unix路径。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <libgen.h>
int main(void) {
char filepath[] = "/foo/bar//baz/";
char *fp = filepath;
while( strcmp(fp, "/") != 0 && strcmp(fp, ".") != 0 ) {
char *base = basename(fp);
puts(base);
fp = dirname(fp);
}
// Differentiate between /foo/bar and foo/bar
if( strcmp(fp, "/") == 0 ) {
puts(fp);
}
}
// baz
// bar
// foo
// /
它不是最有效的,它会通过字符串多次传递,但 正确 。