使用strtok_r()解析文本文件时出现分段错误

时间:2013-10-08 14:22:28

标签: c parsing strtok

我有多行文字文件。像:

11111111
22222222
33333333
44444444
55555555
...

我写了一个c代码来检索每一行。我的代码解析了所有行并成功地将它们写入输出控制台。但在最后一行应用程序崩溃后。它返回

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");
}

仍然发生同样的事情。

3 个答案:

答案 0 :(得分:2)

我认为您致电strtok_r是错误的,请参阅手册

  

#include

     

char * strtok_r(char * s1,const char * s2,char ** s3);

     

要从s1获取第一个标记,将使用s1调用strtok_r()   第一个参数。来自s1的剩余令牌是通过调用获得的   strtok_r(),带有第一个参数的空指针。

答案 1 :(得分:0)

strtok_r的第二次和后续调用应将第一个参数设为NULL。但是,我不确定这就是你遇到段错误的原因。

您还在更改buffer指向

行的位置
buffer = rest;

当您阅读完整个文件并再次退出fgets行后,buffer不再指向大小为size的内存块。我怀疑这会导致你的段错误。

此外,通过修改buffer,您无法free malloc

的内存

答案 2 :(得分:0)

问题是char c[]="...";

的定义

应为char c[20]="...";