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