[英]Segmentation fault when parsing text file with using strtok_r()
我有多行文本文件。 喜欢:
11111111
22222222
33333333
44444444
55555555
...
我写了一个ac代码来检索每一行。 我的代码解析了所有行,并将它们成功写入输出控制台。 但是在最后一行应用程序崩溃之后。 它返回
Program received signal SIGSEGV, Segmentation fault.
这是为什么?
我的C代码:
FILE *fPtr;
char file[]="/root/dd";
char *rest;
char *token;
char *buffer;
unsigned long size;
fPtr = fopen(file,"r");
fseek(fPtr, 0, SEEK_END);
size=(unsigned long)ftell(fPtr);
fseek(fPtr, 0, SEEK_SET);
buffer=(char *)malloc(size);
if(fPtr)
{
while(fgets(buffer, size, fPtr))
{
while(token = strtok_r(buffer, "\n", &rest))
{
printf("token: %s\n", token);
buffer = rest;
}
}
fclose(fPtr);
}
else
{
printf("file not open \n");
}
更新
我认为问题与strtok_r()不相关。 因为我更改了代码,所以:
FILE *fPtr;
char file[]="/root/dd";
char *rest;
char *token;
char *buffer;
unsigned long size;
fPtr = fopen(file,"r");
if(fPtr==NULL)
{
printf("null pointer\n");
}
fseek(fPtr, 0, SEEK_END);
size=(unsigned long)ftell(fPtr);
fseek(fPtr, 0, SEEK_SET);
buffer=(char *)malloc(size);
if(fPtr)
{
while(fgets(buffer, size, fPtr))
{
printf("buffer: %s\n", buffer);
}
fclose(fPtr);
}
else
{
printf("file not open \n");
}
仍然发生同样的事情。
我认为您对strtok_r
调用是错误的,请参考手册
#包括
char * strtok_r(char * s1,const char * s2,char ** s3);
要从s1获得第一个标记,将以s1作为其第一个参数调用strtok_r()。 s1中剩余的令牌是通过使用第一个参数的空指针调用strtok_r()获得的。
对strtok_r
的第二次和后续调用应将第一个参数设为NULL
。 但是,我不确定这就是为什么出现段错误的原因。
您还正在更改buffer
指向行的位置
buffer = rest;
阅读完整个文件并退出fgets
行后, buffer
不再指向大小为size
的内存块。 我怀疑这是造成您的段错误。
另外,通过修改buffer
您无法free
malloc
问题是char c[]="...";
它应该是char c[20]="...";
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.