strtok问题只保存第一个令牌

时间:2011-03-27 18:22:53

标签: c

昨天我的功能出现问题,原来是一个简单的解决方案,现在我遇到了一个令人困惑的问题。该函数是一个标记化器:

void tokenizer(FILE *file, struct Set *set) {
     int nbytes = 100;
     int bytesread;
     char *buffer;
     char *token;
     buffer = (char *) malloc(nbytes + 1);
     while((bytesread = getLine(&buffer,&nbytes,file)) != -1) {
          token = strtok(buffer," ");
          while(token != NULL) {
              add(set,token);
              token = strtok(NULL," ");
          }
     }
}

我知道输入(文本文件)正在被正确分解为令牌,因为在第二个while循环中我可以添加printf(“%s”,token)来显示每个令牌。但问题是添加。它只是将第一个令牌添加到我的列表中,但同时仍然正确地打破了每个令牌。例如,如果我的输入文本是“blah herp derp”,我会得到

token = blah

token = herp

token = derp

但是列表只包含第一个令牌,等等。我不相信问题是添加的,因为它可以独立工作,即我可以使用

add(set,"blah");
add(set,"herp");
add(set,"derp");

,结果将是一个包含所有三个单词的列表。

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

strtok()返回指向字符串缓冲区的指针。您需要strdup()该字符串并将结果添加到树中。清理树时不要忘记free()