所以我猜测我在这里错过了一些相当简单的东西,但我试图逐行读取文件,在我去的时候对缓冲区进行标记。我已经粘贴了我尝试用我的代码做的基础知识。我从来没有遇到strtok的问题,所以我猜测它与我使用的缓冲区有关。在正确的方向上任何推动?我读到strtok不是一个很好的选择,但它是我熟悉的唯一东西(我想我可以编写自己的函数) 它会读取第一个令牌,因为它每次都应该这样做。在我尝试使用" strtok(NULL,"");""
找到第二个令牌之前,它不会出错。我不知道为什么这个被重复投票。是的,那里有答案可以说明我尝试做什么的基础知识,但我想了解问题,而不仅仅是剪切和粘贴。"我更喜欢知道为什么存在seg错误以及为什么我的代码表现得像它一样。当我在其他帖子中直接提出未直接指出的具体问题时,无需进行投票。
const char *file = "path/to/file/file.txt";
void tokenize();
//Eventually file will be command line opt
FILE *open_file(const char *file);
int main(int argc, char *argv[])
{
tokenize();
}
void tokenize()
{
FILE *fp;
fp = open_file(file);
char buffer[BUFSIZ];
while(fgets(buffer,BUFSIZ,fp) != NULL)
{
//puts("========================================");
//puts(buffer);
//puts("========================================");
char *data = strdup(buffer);
char *token;
token = strtok(data, " ");
//puts(token);
while(token != NULL)
{
token = strtok(NULL, " ");
puts("++++++++++++++++++++++++++++++++++++++++++++++");
puts(token);
puts("++++++++++++++++++++++++++++++++++++++++++++++");
}
}
fclose(fp)
}
FILE *open_file(const char *file)
{
FILE *fp;
fp = fopen(file, "r");
if(fp == NULL)
{
perror("Error opening file");
}
return fp;
}
答案 0 :(得分:3)
您的while
循环检查token
是否为NULL,但在使用之前在循环的第一行修改它。对strtok()
的第二次调用应该在循环结束时:
while(token != NULL)
{
puts("++++++++++++++++++++++++++++++++++++++++++++++");
puts(token);
puts("++++++++++++++++++++++++++++++++++++++++++++++");
token = strtok(NULL, " ");
}
另外,请不要忘记外部free(data)
循环底部的while
。否则,您有内存泄漏。
答案 1 :(得分:0)
您还有内存泄漏
char *data = strdup(buffer);
strdup
使用malloc
为dup字符串分配内存,由free
负责。但是,你不会,并且在每个循环中用另一个循环覆盖先前分配的指针,导致内存泄漏。
不是一个真正的答案,我重新编辑了一个错误的答案,以便你喜欢这样做。
答案 2 :(得分:0)
谢谢大家!这是我的解决方案
while(fgets(buffer,BUFSIZ,fp) != NULL)
{
char *token;
token = strtok(buffer, " ");
while(token != NULL)
{
token = strtok(NULL, " ");
**if(token != NULL)**
{
printf("%s\n", token);
}
}
}
fclose(fp);
正如其他答案中所指出的那样,问题不是为了对NULL值进行标记,而是在尝试打印NULL值。我在while循环中添加了检查if(token!= NULL)后,一切顺利。