繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM