我想对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()
。
答案 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);
}