【问题标题】:strtok deletes my string except the first tokenstrtok 删除我的字符串,除了第一个标记
【发布时间】:2017-05-05 21:06:23
【问题描述】:

我有带有歌曲详细信息的链接列表,并且想要比较两首歌曲的名称......额外的任务是通过比不同的单词更多的相似词来比较它们......我使用 strtok 逐字获取它然后检查如果当前单词包含在另一个名称中...但是当我这样做时 strtok 清除我的字符串,除了第一个单词...我该如何逃脱呢?

   while (next_token)
            {
                currentCounter++;
                if (searchword(temp->author, next_token)==1)
                {
                    counter++;
                }
                next_token = strtok(NULL, " ");

            }

【问题讨论】:

  • 您是否阅读了有关strtok() 实际操作的文档?
  • strtok() 的工作原理是用空字节覆盖分隔符,以便每个标记成为一个单独的字符串。如果您需要原始字符串,请在使用 strtok() 之前对其进行复制。
  • no no.... 例如 temp->author 是 "bon jovi"....在第一次迭代时 next_token 得到 "bon" 但在第二次删除 temp->author 中的所有内容,除了“bon”,无法转到下一个标记
  • 您的第一个 strtok() 语句在哪里?你需要像 next_token = strtok( string, " "); 这样的东西,在使用 next_token = strtok(NULL, " "); 之前应该在那里
  • 仅仅提供那些试图帮助你的人所要求的东西有什么困难?显示原始输入字符串,以及对strtok(.); 的第一次调用,与失败的代码中的完全一样。

标签: c linked-list strtok


【解决方案1】:

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 覆盖了空格,所以所有常规文本处理例程(strcpystrcatprintf、@ 987654329@ 等)只看到第一个令牌。

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

【讨论】:

  • 非常感谢约翰·博德!
猜你喜欢
  • 1970-01-01
  • 2013-07-05
  • 1970-01-01
  • 2011-06-24
  • 2011-05-29
  • 1970-01-01
  • 1970-01-01
  • 2012-11-27
相关资源
最近更新 更多