strtok 删除我的字符串,除了第一个标记
strtok deletes my string except the first token
我有包含歌曲详细信息的链接列表,想比较两首歌曲的名称...额外的任务是通过具有比不同单词更多的相似词来比较它们...我使用 strtok 逐字获取它并且然后检查当前单词是否包含在另一个名称中...但是当我这样做时 strtok 清除我的字符串,除了第一个单词...我怎样才能摆脱它?
while (next_token)
{
currentCounter++;
if (searchword(temp->author, next_token)==1)
{
counter++;
}
next_token = strtok(NULL, " ");
}
strtok
通过用 0 覆盖分隔符来修改输入数组;这并不是第一个标记被删除或清除后的所有内容,只是第一个标记后面有一个字符串终止符,所以它被打印后什么也没有。
例如:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main( void )
{
char str[] = "This is a test";
printf( "before strtok: " );
for ( size_t i = 0; i < sizeof str; i++ )
{
if ( isprint( str[i] ) )
putchar( str[i] );
else
putchar( '.' );
}
putchar ( '\n' );
char *token = strtok( str, " " );
while ( token )
{
printf( "token = %8s, str = ", token );
for ( size_t i = 0; i < sizeof str; i++ )
{
if ( isprint( str[i] ) )
putchar( str[i] );
else
putchar( '.' );
}
putchar( '\n' );
token = strtok( NULL, " " );
}
printf( "after all strtok: " );
for ( size_t i = 0; i < sizeof str; i++ )
{
if ( isprint( str[i] ) )
putchar( str[i] );
else
putchar( '.' );
}
putchar( '\n' );
return 0;
}
这是输出(在本例中 .
代表 0):
before strtok: This is a test.
token = This, str = This.is a test.
token = is, str = This.is.a test.
token = a, str = This.is.a.test.
token = test, str = This.is.a.test.
after all strtok: This.is.a.test.
在 strtok
调用之后,所有其他标记仍然存在,但是因为我们用 0 覆盖了空格,所以所有常规文本处理例程(strcpy
、strcat
、printf
、puts
等)只能看到第一个标记。
如果您想保留原始字符串的内容,您必须将它们复制到另一个缓冲区并对该缓冲区执行 strtok
调用。
我有包含歌曲详细信息的链接列表,想比较两首歌曲的名称...额外的任务是通过具有比不同单词更多的相似词来比较它们...我使用 strtok 逐字获取它并且然后检查当前单词是否包含在另一个名称中...但是当我这样做时 strtok 清除我的字符串,除了第一个单词...我怎样才能摆脱它?
while (next_token)
{
currentCounter++;
if (searchword(temp->author, next_token)==1)
{
counter++;
}
next_token = strtok(NULL, " ");
}
strtok
通过用 0 覆盖分隔符来修改输入数组;这并不是第一个标记被删除或清除后的所有内容,只是第一个标记后面有一个字符串终止符,所以它被打印后什么也没有。
例如:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main( void )
{
char str[] = "This is a test";
printf( "before strtok: " );
for ( size_t i = 0; i < sizeof str; i++ )
{
if ( isprint( str[i] ) )
putchar( str[i] );
else
putchar( '.' );
}
putchar ( '\n' );
char *token = strtok( str, " " );
while ( token )
{
printf( "token = %8s, str = ", token );
for ( size_t i = 0; i < sizeof str; i++ )
{
if ( isprint( str[i] ) )
putchar( str[i] );
else
putchar( '.' );
}
putchar( '\n' );
token = strtok( NULL, " " );
}
printf( "after all strtok: " );
for ( size_t i = 0; i < sizeof str; i++ )
{
if ( isprint( str[i] ) )
putchar( str[i] );
else
putchar( '.' );
}
putchar( '\n' );
return 0;
}
这是输出(在本例中 .
代表 0):
before strtok: This is a test.
token = This, str = This.is a test.
token = is, str = This.is.a test.
token = a, str = This.is.a.test.
token = test, str = This.is.a.test.
after all strtok: This.is.a.test.
在 strtok
调用之后,所有其他标记仍然存在,但是因为我们用 0 覆盖了空格,所以所有常规文本处理例程(strcpy
、strcat
、printf
、puts
等)只能看到第一个标记。
如果您想保留原始字符串的内容,您必须将它们复制到另一个缓冲区并对该缓冲区执行 strtok
调用。