【问题标题】:Split String into it's words [closed]将字符串拆分成单词[关闭]
【发布时间】:2013-11-21 00:32:37
【问题描述】:

我有一个长文本作为字符串,我想使用 C 将它拆分为单个单词。 我尝试了strtok() 的解决方案,但这对我来说感觉像是一个肮脏的解决方案,因为我有所有的指针疯狂。 是否有直接的解决方案将字符串拆分为单词并将它们存储在数组中?

我想到了一个 for 循环,它迭代字符串并在出现空格或句号时启动一个新的“计数器”,但在存储它时我总是感到困惑......

希望你能帮助我

【问题讨论】:

  • strtok 是正确的方法。如果您要使用 C 编程,恐怕您将不得不习惯“疯狂指针”
  • strtok 并不总是最佳选择,原因有两个。它破坏了原始字符串,并且不是线程安全的。但是,如果您可以忍受,那么 strtok 可以工作,如果您不想破坏原始字符串,请先使用 strdup 制作副本并将其传递给 strtok。

标签: c arrays string split


【解决方案1】:

也许你可以像这样处理字符串。这只是一个简单的演示。因此,您可能需要在将代码投入实际使用之前对其进行细化。

#define skip_white_space(p)               \
    do {                                  \
        while (*p != '\0' && isspace(*p)) \
            ++p;                          \
    } while (0)

#define skip_non_space(p)                  \
    do {                                   \
        while (*p != '\0' && !isspace(*p)) \
            ++p;                           \
    } while (0)

#define WORD_MAXLEN 64

char **strsplit(char *text, int *nword)
{
    char *p, *q, **words;

    words = NULL;
    *nword = 0;

    p = text;
    while (*p != '\0') {
        skip_white_space(p);
        q = p;
        skip_non_space(p);
        if (p > q) {
            ++*nword;
            words = (char **)realloc(words, *nword * sizeof(*words));
            words[*nword - 1] = (char *)malloc(WORD_MAXLEN);
            strncpy(words[*nword - 1], q, p - q);
            words[*nword - 1][p - q] = '\0';
        }
        skip_white_space(p);
    }

    return words;
}

【讨论】:

  • 看起来不错!候选改进 - 但并不是真的要从一个合理的答案中删除。:1)malloc(WORD_MAXLEN) ... strncpy()。更改为malloc(p-q+1) ... memcpy(words[*nword - 1], q, p - q); 2) const char *text 3) 删除第二个skip_white_space(p); 4) 在realloc() & malloc() 之前删除演员表 5) 删除WORD_MAXLEN
  • @chux 那么,您的意思是以下内容吗? 1) 减少不必要的内存分配,防止复制被'\0'停止; 2) 保持原字符串不变; 3) 删除无用的调用; 4) 删除无用的演员表; 5) 删除因为 1) 的无用宏;谢谢:)
  • 是的,除了“被'\0'停止”。因为从q&q[p-q-1] 之间没有\0。 #1 也是为了防止子字符串超过 WORD_MAXLEN 时出现问题。
猜你喜欢
  • 1970-01-01
  • 2016-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-12
  • 2014-07-31
  • 1970-01-01
  • 2014-06-09
相关资源
最近更新 更多