用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
// /

它不是最有效的,它多次遍历字符串,但它是 正确的.