用strtok解析单词

时间:2014-11-11 21:20:01

标签: c strtok

我想对strtok()说使用除字母数字字符以外的所有内容。

我的尝试是ref的例子:

/* strtok example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] ="- This, a sample string.";
  char * pch;
  printf ("Splitting string \"%s\" into tokens:\n",str);
  pch = strtok (str," ,.-");
  while (pch != NULL)
  {
    printf ("%s\n",pch);
    pch = strtok (NULL, " ,.-");
  }
  return 0;
}

但是我要解析真实的文本文件(包含网站的评论)。目前我检查了其他的分隔符是什么,我增加了strtok()的第二个参数。例如,我看到[,所以我做了" ,.-["等等,但是好吧我可能会错过一些东西,也许新的文本文件包含一个新的分隔符。

我不能做更聪明的事情(实际上是正确的,因为这不是)?

例如,如果我得到:

[Hello_sir I'm George]

我想获得这些代币:

Hello
sir
I
m
George

问题在于我不知道哪个是分界符。

我想说使用除字母数字字符以外的所有内容。


修改

我想到逐个字符并检查它是否是字母数字,但我希望内置一些东西,比如按需要喂strtok()

2 个答案:

答案 0 :(得分:2)

使用strtok执行此操作的唯一方法(不使用其他内容覆盖源字符串的非字母数字字符)将传递包含所有非字母数字字符的分隔符字符串。你可以在第一次运行时构建一次,如下所示:

static char delims[256]; /* this is oversized */

...

void
initdelims()
{
    int i;
    int j = 0;
    for (i = 1; i<256; i++)
    {
        if (!isalnum(i))
            delims[j++] = i;
    }
    delims[j] = 0; /* this is unnecessary as statics are initialised to zero */
}

然后使用delims作为分隔符字符串。

然而,这既丑陋又低效。你最好编写一个手动解析器,必要时借用source to strtok

答案 1 :(得分:1)

您可以在一个字符串中一次性收集非字母数字字符,然后将该字符串用作strtok()的分隔符集:

char delims[(1 << CHAR_BIT) + 1] = { 0 };
for (int i = 0, j = 0; i < sizeof delims - 1; i++) {
    if (!isalnum(i)) {
        delims[j++] = i;
    }
}

pch = strtok(str, delims);
while (pch != NULL)
{
    printf ("%s\n",pch);
    pch = strtok(NULL, delims);
}