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”中的函数答案 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
使用谓词,您可以在其中指定跳过字符的任何规则。