2017-05-05 77 views
-6

我有链接列表与歌曲的详细信息,并希望比较两个歌曲名称...额外的任务是比较他们有更多相似的词比不同的单词...我使用strtok一字一句地检查它,然后检查当前单词是否包含在其他名字中......但是当我这样做的时候,strtok清除了我的字符串,除了第一个单词......我该如何逃避?strtok删除我的字符串,除了第一个标记

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

      } 
+7

您是否阅读过有关'strtok(*)* * * *的文档? – EOF

+4

'strtok()'通过用空字节覆盖分隔符来工作,以便每个标记都变成一个单独的字符串。如果您需要原始字符串,请在使用'strtok()'之前复制它。 – Barmar

+0

no no ....例如temp-> author是“bon jovi”....在第一次迭代时next_token获得“bon”,但第二次删除了temp-> author之外的所有内容,除了“bon”并且不能转到next token –

回答

2

strtokstrtok通过用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调用。

+0

非常感谢John Bode! –