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

C 使用strtok_r()解析文本文件时出现分段错误,c,parsing,strtok,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 *t

我有多行的文本文件。比如:

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

同样的事情也发生了。

我想你打电话给strtok\u r是错误的,引用手册

#包括

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

要从s1获取第一个令牌,将调用strtok_r(),并将s1作为其 第一个参数。来自s1的剩余令牌通过调用 strtok_r(),第一个参数的指针为空


strtok\u r
的第二次和后续调用的第一个参数应为
NULL
。然而,我不确定这就是为什么你有这个毛病

您还将更改
缓冲区
在行中指向的位置

buffer = rest;
读取整个文件并退出后,
fgets
行再次运行,
buffer
不再指向大小为
size
的内存块。我怀疑这是你的错


此外,通过修改
缓冲区
,您无法
释放
malloc

内存,问题是
字符c[]=“…”的定义


它应该是
charc[20]=“…”

您应该在尝试使用前检查
fPtr
是否为空,而不是在fseeking之后。。另外,您可以为整个文件分配空间,然后仍然使用
fgets()
逐行读取。这是加载文件问题的两种不同解决方案的两个部分。
size
是您期望的值吗?在使用缓冲区之前,还应检查缓冲区是否为空。