用C中的定界符分割字符串
Splitting a string by a delimiter in C
给定路径
/level1/level2/level3/level4
我希望能够拆分此字符串,以便我可以检索每个单独的条目,
即 "level1"、"level2"、"level3"、"level4"。
现在我的第一个想法是使用strtok
,但显然大多数人建议反对使用此功能。另一种方法是什么,以便我可以传入 string (char* path)
并将每个条目拆分为“/”。
strtok
实际上是标记这样的字符串的首选方法。您只需要注意:
- 修改原字符串
- 该函数在解析期间使用静态数据,因此它不是线程安全的,您不能交错解析两个单独的字符串。
如果您不想修改原始字符串,请使用 strdup
制作副本并处理副本,然后根据需要复制结果。如果您需要担心多线程或交错使用,请改用 strtok_r
,它有一个额外的状态参数。
拆分 Unix 路径不仅仅是拆分 /
。这些都指向相同的路径...
/foo/bar/baz/
/foo/bar/baz
/foo//bar/baz
与许多复杂的任务一样,最好不要自己动手,而是使用现有的功能。在这种情况下,有 POSIX dirname
and basename
函数。
dirname
returns 文件路径中的父路径
basename
returns 文件路径的最后一部分
结合使用这些,您可以拆分 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
// /
它不是最有效的,它多次遍历字符串,但它是 正确的.
给定路径
/level1/level2/level3/level4
我希望能够拆分此字符串,以便我可以检索每个单独的条目,
即 "level1"、"level2"、"level3"、"level4"。
现在我的第一个想法是使用strtok
,但显然大多数人建议反对使用此功能。另一种方法是什么,以便我可以传入 string (char* path)
并将每个条目拆分为“/”。
strtok
实际上是标记这样的字符串的首选方法。您只需要注意:
- 修改原字符串
- 该函数在解析期间使用静态数据,因此它不是线程安全的,您不能交错解析两个单独的字符串。
如果您不想修改原始字符串,请使用 strdup
制作副本并处理副本,然后根据需要复制结果。如果您需要担心多线程或交错使用,请改用 strtok_r
,它有一个额外的状态参数。
拆分 Unix 路径不仅仅是拆分 /
。这些都指向相同的路径...
/foo/bar/baz/
/foo/bar/baz
/foo//bar/baz
与许多复杂的任务一样,最好不要自己动手,而是使用现有的功能。在这种情况下,有 POSIX dirname
and basename
函数。
dirname
returns 文件路径中的父路径basename
returns 文件路径的最后一部分
结合使用这些,您可以拆分 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
// /
它不是最有效的,它多次遍历字符串,但它是 正确的.