[英]Tokenizing buffer segmentation fault
因此,我想我在这里缺少了一些相当简单的东西,但是我试图逐行读取文件,并随即标记化缓冲区。 我已经粘贴了我要使用代码进行操作的基础知识。 我从未遇到过strtok的问题,所以我猜想它与我正在使用的缓冲区有关。 有没有朝着正确的方向发展? 我读到strtok并不是一个很好的选择,但这是我唯一熟悉的东西(我想我可以编写自己的函数),它每次都会读取第一个令牌。 直到我尝试使用“ strtok(NULL,“”);“查找第二个标记时,它才出现故障。
我不知道为什么这个被否决为重复。 是的,那里有答案可以告诉我我要做什么的基本知识,但我想理解问题,而不仅仅是剪切和粘贴。”我更想知道为什么存在段错误以及为什么我的错误代码照常运行,当我问其他帖子中未直接指出的特定问题时,无需投票。
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;
}
while
循环检查token
是否不为NULL,但在使用token
之前先在循环的第一行对其进行修改。 对strtok()
的第二次调用应在循环的结尾:
while(token != NULL)
{
puts("++++++++++++++++++++++++++++++++++++++++++++++");
puts(token);
puts("++++++++++++++++++++++++++++++++++++++++++++++");
token = strtok(NULL, " ");
}
另外,不要忘记在外部while
循环的底部free(data)
。 否则,您将发生内存泄漏。
你也有一个内存泄漏
char *data = strdup(buffer);
strdup
使用malloc
为dup字符串分配内存,这是您的责任free
。 但是,您没有这样做,并且在每个循环中您都用另一个指针覆盖了先前分配的指针,从而导致内存泄漏 。
这不是真正的答案,我重新编辑了一个错误的答案,以使您喜欢。
感谢大家! 这是我的解决方案
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)之后,世界一切都很好
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.