C 用strtok解析单词

C 用strtok解析单词,c,strtok,C,Strtok,我想说的是,除了字母数字字符以外,其他所有字符都可以用作delimeters 我的尝试是以下示例: 问题是我不知道哪一个是delimeters 我想说的是,除了字母数字字符以外,所有字符都可以用作delimeters。 编辑 我想一个字符一个字符地检查它是否是字母数字,但我希望它是内置的,比如根据需要输入strtok()这是使用strtok实现这一点的唯一方法(不必用其他内容覆盖源字符串的非字母数字字符)将传递一个包含所有非字母数字字符的分隔符字符串。您可以在第一次运行时构建一次,如下所示:

我想说的是,除了字母数字字符以外,其他所有字符都可以用作delimeters

我的尝试是以下示例:

问题是我不知道哪一个是delimeters

我想说的是,除了字母数字字符以外,所有字符都可以用作delimeters。


编辑


我想一个字符一个字符地检查它是否是字母数字,但我希望它是内置的,比如根据需要输入
strtok()

这是使用
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 */
}
静态字符集[256];/*这个太大了*/
...
无效的
initdelims()
{
int i;
int j=0;

对于(i=1;i您可以在一次过程中在一个字符串中收集一次非字母数字字符,然后将该字符串用作
strtok()
的分隔符集:


char-delims[(1也许你可以使用
isalpha
char-by-char?哦,是的,我也考虑过了,让我更新@user2485710使其生效,因为没有。@BLUEPIXY,我也需要保留数字,这很害羞,我说的是字母数字。你认为如果我将第二个参数传递给你的函数
isalnum()
一切正常?@G.Samaras一切正常。这正是我所想的。但是,出于可移植性的原因,您应该使用
1
strtok
将每个字符的分隔符字符串的200多个字符循环。
isalpha
IIRC在固定位图中查找。因此
strtok
具有200多个字符定界符可能比手动滚动的速度慢200倍,这没有多大乐趣。这不起作用,我只是测试了一下。但是,在问题的评论中,我得到了一个自定义实现,它完全符合我的要求,所以我想我们可能应该删除我的问题(只有在删除答案的情况下才能这样做)。我认为问题在于I=0不是字母数字,因此
delims
是空的。在源代码中修复了这一问题。建议将其留给其他人(如果只是因为他们将学习到手动滚动更有用)使用
isalnum()的好方法
,但请注意关于字符位的这一点:。我使用了256+1,但代码不起作用。我使用了256+1,但代码不起作用,我只是进行了测试。然而,在问题的注释中,我得到了一个自定义实现,它完全符合我的要求,所以我想我们可能应该删除我的问题(只有在删除答案后才能执行此操作)。
Hello
sir
I
m
George
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 */
}
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);
}