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