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 覆盖了空格,所以所有常规文本处理例程(strcpystrcatprintfputs 等)只能看到第一个标记。

如果您想保留原始字符串的内容,您必须将它们复制到另一个缓冲区并对该缓冲区执行 strtok 调用。