strtok,使分隔符成为一系列ASCII值

时间:2015-12-31 16:13:11

标签: c ascii delimiter strtok

char *p_word;

p_word = strtok (p_input, " ,.-:\n1234567890");

while (p_word != NULL)
{
    printf ("%s\n", p_word);
    p_word = strtok (NULL, " ,.-:\n1234567890");
}

我正在阅读一个文本文件,并希望一次对每个单词执行各种功能,忽略不属于字母表的任何字符。

我想知道是否有办法而不是在分隔符中键入每个不需要的字符(例如“,.-:\ n1234567890”),我可以指定一个我不想要的ASCII十进制值范围,即0-64,或者不是字母字符。

由于

编辑:我不允许使用未经教过的材料,所以我不认为我可以使用“ctype.h”中的函数

2 个答案:

答案 0 :(得分:1)

如果你必须使用strtok,你可以建立一个这样的分隔符字符串(假设是ASCII字符集),它排除了字母表。

char *p_word;
char delims[128];
int dindex;
int i;

dindex = 0;
for (i = 1; i < 'A'; i++)
    delims[dindex++] = i;
for (i = 'Z' + 1; i < 'a'; i++)
    delims[dindex++] = i;
for (i = 'z' + 1; i < 128; i++)
    delims[dindex++] = i;
delims[dindex] = '\0';

p_word = strtok (p_input, delims);

答案 1 :(得分:0)

您可以编写自己的strtok函数,该函数将接受谓词作为第二个参数。

当然,您应该根据自己的喜好使用其他名称。

这是一个示范程序。我编写了一个简化的谓词来检查任何alpha ASCII字符。您可以使用自己的谓词。

#include <stdio.h>

char * strtok( char *s, int cmp( char ) )
{
    static char *p;

    if ( s ) p = s;

    if ( p )
    {
        while ( *p && cmp( *p ) ) ++p;
    }

    if ( !p || !*p ) return NULL;

    char *t = p++;

    while ( *p && !cmp( *p ) ) ++p;

    if ( *p ) *p++ = '\0';

    return t;
}

int cmp( char c )
{
    c |= 0x20;

    return c < 'a' || c > 'z'; 
}

int main( void )
{
    char s[] = "   ABC123abc<>XYZ!@#xyz";
    char *p = strtok( s, cmp );

    while ( p )
    {
        puts( p );
        p = strtok( NULL, cmp );
    }
}

程序输出

ABC
abc
XYZ
xyz

使用谓词,您可以在其中指定跳过字符的任何规则。