昨天我的功能出现问题,原来是一个简单的解决方案,现在我遇到了一个令人困惑的问题。该函数是一个标记化器:
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");
,结果将是一个包含所有三个单词的列表。
感谢您的帮助!
答案 0 :(得分:2)
strtok()
返回指向字符串缓冲区的指针。您需要strdup()
该字符串并将结果添加到树中。清理树时不要忘记free()
。