簡體   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