在C中用分隔符拆分字符串

时间:2017-11-21 19:34:57

标签: c string token strtok

给出路​​径

/level1/level2/level3/level4

我希望能够分割这个字符串,以便我可以检索每个单独的条目,
即" level1"," level2"," level3"," level4"。

现在我的第一个想法是使用strtok,但显然大多数人都建议使用此功能反对。另一种方法是什么,以便我可以传入string (char* path)并将每个条目拆分为" /"。

2 个答案:

答案 0 :(得分:4)

实际上,

strtok是标记字符串的首选方法。你只需要知道:

  • 原始字符串已修改
  • 该函数在解析过程中使用静态数据,因此它不是线程安全的,您不能交错解析两个单独的字符串。

如果您不想修改原始字符串,请使用strdup制作副本并处理副本,然后根据需要复制结果。如果您需要担心多个线程或交错使用,请使用strtok_r而不是其他状态参数。

答案 1 :(得分:3)

拆分Unix路径不仅仅是拆分/。这些都指的是相同的路径......

  • /foo/bar/baz/
  • /foo/bar/baz
  • /foo//bar/baz

与许多复杂任务一样,最好不要自己动手,而是使用现有功能。在这种情况下,有POSIX dirnamebasename函数。

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

它不是最有效的,它会通过字符串多次传递,但 正确