C strtok删除除第一个标记之外的字符串

C strtok删除除第一个标记之外的字符串,c,linked-list,strtok,C,Linked List,Strtok,我有歌曲详细信息的链接列表,想比较两首歌的名字。。。额外的任务是通过使用更多相似的单词而不是不同的单词来比较它们…我使用strtok逐字获取它们,然后检查当前单词是否包含在其他名称中…但是当我这样做时,strtok会清除除第一个单词以外的字符串…我如何从中逃脱 while (next_token) { currentCounter++; if (searchword(temp->author, n

我有歌曲详细信息的链接列表,想比较两首歌的名字。。。额外的任务是通过使用更多相似的单词而不是不同的单词来比较它们…我使用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;
}
< > >代码> Sttok调用之后,所有其他令牌仍在那里,但由于我们已经用空白覆盖了空白空间,所有常规的文本处理例程(<代码> StrucP,<代码> STARCAT< /COD>,<代码> Prtff<代码>,<代码>放置等)只看到第一个令牌。p>
如果要保留原始字符串的内容,必须将其复制到另一个缓冲区中,并对该缓冲区执行
strtok
调用

您是否阅读了文档了解了strtok()的实际功能?
strtok()的工作原理是用空字节覆盖分隔符,使每个标记成为一个单独的字符串。如果您需要原始字符串,请在使用
strok()
之前复制一份。否否。。。。例如,temp->author是“bon jovi”…在第一次提交时,next_token得到“bon”,但在第二次提交时,删除temp->author中除“bon”之外的所有内容,无法转到next token。您的第一条strok()语句在哪里?您需要类似于
next\u token=strtok(string,”)的东西next_token=strtok(NULL,”)之前应该存在的code>仅仅提供那些试图帮助你的人所要求的东西有什么困难?显示原始输入字符串,以及对
strtok(.)的第一次调用,正如您在代码中看到的那样,这让您很失望。非常感谢John Bode!
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.