【问题标题】:Splitting a string by a delimiter in C在C中通过分隔符拆分字符串
【发布时间】:2018-05-05 09:33:44
【问题描述】:

给定路径

/level1/level2/level3/level4

我希望能够拆分此字符串,以便我可以检索每个单独的条目,
即“level1”、“level2”、“level3”、“level4”。

现在我的第一个想法是使用strtok,但显然大多数人反对使用此功能。还有什么方法可以让我传入string (char* path) 并在“/”处拆分每个条目。

【问题讨论】:

  • 了解strtok
  • strtok 的唯一问题是它修改了您调用它的字符串。如果您对此表示满意(并且字符串不是const),那么就没有问题。
  • 循环调用strchr
  • Parse a String。它已经回答了许多其他问题。
  • @Pouyan.Bn 那是用 C++ 编写的。这个问题在 C 中。

标签: c string token strtok


【解决方案1】:

拆分 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
// /

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

【讨论】:

    【解决方案2】:

    strtok 实际上是标记此类字符串的首选方式。您只需要注意:

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

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

    【讨论】:

    • 是的,可能没问题,当出现char[] (ideone.com/p2H6WX) 时,const char *ptr 会出现问题
    • my answer 中所述,拆分 Unix 路径不仅仅是在 / 上拆分。
    猜你喜欢
    • 2011-03-29
    • 2010-11-10
    • 2014-03-02
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    • 2013-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多