0

我有多行的文本文件。像:

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

仍然发生同样的事情。

4

3 回答 3

2

我认为您致电strtok_r是错误的,请从手册中引用

#包括

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

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

于 2013-10-08T14:28:59.677 回答
0

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

您还在更改buffer行中指向的位置

buffer = rest;

当您读取整个文件并退出时,该fgets行再次运行,buffer不再指向 size 的内存块size。我怀疑这是导致你的段错误。

此外,通过修改,buffer您无法获取之前free的内存malloc

于 2013-10-08T14:32:21.290 回答
0

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

它应该是char c[20]="...";

于 2014-05-12T20:17:08.233 回答