使用strtok对C中的字符串进行标记(包括数字作为分隔符)

时间:2013-10-20 16:41:12

标签: c string tokenize

所以我有以下功能:

void tokenize() {
    char *word;
    char text[] = "Some - text, from stdin. We'll see! what happens? 4ND 1F W3 H4V3 NUM83R5?!?";
    int nbr_words = 0;

    word = strtok(text, " ,.-!?()");

    while (word != NULL) {
    printf("%s\n", word);
    word = strtok(NULL, " ,.-!?()");
    nbr_words += 1;
    }
}

输出是:

Some
text
from
stdin
We'll
see
what
happens
4ND
1F
W3
H4V3
NUM83R5


13 words

基本上我正在做的是将文本段落标记为单词,以便进一步分析。我有我的文字,我有我的分隔符。唯一的问题是与所有其他分隔符同时对数字进行标记。我知道我可以在isdigit中使用ctype.h。但是,我不知道如何将其包含在strtok

例如(显然是错误的):strtok(paragraph, " ,.-!?()isdigit()");

这些方面的东西。但是因为在这个阶段我有每个令牌(单词),是否有某种后处理if语句我可以用来进一步标记每个单词,在数字处分裂?

例如,输出将进一步降级为:

ND
F
W
H
V
NUM
R

15 words // updated counter to include new tokens

2 个答案:

答案 0 :(得分:2)

strtok在这方面非常简单:只需将所有数字列为分隔符,一个接一个 - 就像这样:

strtok(paragraph, " ,.-!?()0123456789");

注意:strtok是一个旧的,不可重入的函数,不应在现代程序中使用。您应切换到strtok_r,它具有类似的界面,但可以在并发环境和其他需要重入的情况下使用。

答案 1 :(得分:1)

为什么不使用

    word = strtok(text, " ,.-!?()1234567890");