C 解析文本文件时出现分段错误
我正在做一些简单的逻辑来解析逗号分隔的文本文件。当我给出sz+1时,我在最外层的while循环中得到了精确的分段错误。但是我使用了sizeof(str1)来代替sz+1,然后我顺利地摆脱了它,但是结果没有准确地捕捉到。在完成总迭代之后,我在最后得到分段错误。。 请任何人帮助我C 解析文本文件时出现分段错误,c,linux,C,Linux,我正在做一些简单的逻辑来解析逗号分隔的文本文件。当我给出sz+1时,我在最外层的while循环中得到了精确的分段错误。但是我使用了sizeof(str1)来代替sz+1,然后我顺利地摆脱了它,但是结果没有准确地捕捉到。在完成总迭代之后,我在最后得到分段错误。。 请任何人帮助我 int main() { char *str1; unsigned char user_id[10]="",pwd[10]="",name[75]="",frm_dt[1
int main()
{
char *str1;
unsigned char user_id[10]="",pwd[10]="",name[75]="",frm_dt[15]="", to_dt[15]="", ntry_dt[15]="",lim_amt[15]="",act_flag[5]="";
char *ptr;
char *temp;
int i=1,t,rc=0,sz=0;
char delims[]=",";
char filename[100] = "/home/erpdirect/Desktop/billcollectors.txt";
FILE *fp;
temp = (char*)malloc(strlen(ptr)+1);
rc=0;
fp= fopen("/home/erpdirect/Desktop/billcollectors.txt","r");
if (fp == NULL)
{
printf("No such file");
//return 1;
}
fseek(fp, 0L, SEEK_END);
sz = ftell(fp);
fseek(fp, 0L, SEEK_SET);
printf("Size of File : %d \n",sz);
printf("\nLoop is in file pointer\n");
str1 =(char*)malloc(sz*sizeof(char));
while(fgets(str1,sz+1,fp) !=NULL)
{
printf("\n");
ptr=strtok(str1,delims);
//printf("\nPoints to >>>>>>>>> %s",ptr);
while(ptr != NULL)
{
i=1;
memset(user_id,0,sizeof(user_id));
memset(name,0,sizeof(name));
memset(pwd,0,sizeof(pwd));
memset(frm_dt,0,sizeof(frm_dt));
memset(to_dt,0,sizeof(to_dt));
memset(lim_amt,0,sizeof(lim_amt));
memset(ntry_dt,0,sizeof(ntry_dt));
memset(act_flag,0,sizeof(act_flag));
while(ptr!=NULL && i<=16)
{
strcpy(temp, ptr);
printf("\nTemp values are : %s",temp);
ptr = strtok(NULL,delims);
//printf("\nPoints to >>>>>>>>> %s",ptr);
switch(i)
{
case 1: strcpy(user_id,temp);
printf("\nUSER ID: %s",user_id);
break;//insert into categoryId
case 2: strcpy(pwd,temp);
printf("\nPASSWORD: %s",pwd); break;
case 3: strcpy(name,temp);
printf("\nName: %s",name); break;
case 4: strcpy(frm_dt,temp);
printf("\nFROM DATE: %s",frm_dt); break;
case 5: strcpy(to_dt,temp);
printf("\nTO DATE: %s",to_dt); break;
case 6: strcpy(lim_amt,temp);
printf("\nLIMIT Amt: %s",lim_amt); break;
case 7: strcpy(ntry_dt,temp);
printf("\nEntry Date: %s",ntry_dt); break;
case 8: strcpy(act_flag,temp);
printf("\nActive flag: %s",act_flag); break;
default:break;
}//switch
i++;
}//while
}//while
}//while
free(str1);
free(temp);
fclose(fp);
return SUCCESS;
}
intmain()
{
char*str1;
无符号字符用户id[10]=“”,pwd[10]=“”,名称[75]=“”,frm\U dt[15]=“”,to\U dt[15]=“”,ntry\U dt[15]=“”,lim\U金额[15]=“”,act\U标志[5]=“”;
char*ptr;
字符*温度;
int i=1,t,rc=0,sz=0;
字符delims[]=“,”;
char filename[100]=“/home/erpdirect/Desktop/billcollectors.txt”;
文件*fp;
temp=(char*)malloc(strlen(ptr)+1);
rc=0;
fp=fopen(“/home/erpdirect/Desktop/billcollectors.txt”,“r”);
如果(fp==NULL)
{
printf(“无此类文件”);
//返回1;
}
fseek(fp,0L,SEEK_END);
sz=ftell(fp);
fseek(fp、0L、SEEK\u集);
printf(“文件大小:%d\n”,sz);
printf(“\n指针位于文件指针\n”中);
str1=(char*)malloc(sz*sizeof(char));
while(fgets(str1,sz+1,fp)!=NULL)
{
printf(“\n”);
ptr=strtok(str1,delims);
//printf(“\n指向>>>>%s”,ptr);
while(ptr!=NULL)
{
i=1;
memset(user_id,0,sizeof(user_id));
memset(name,0,sizeof(name));
memset(pwd,0,sizeof(pwd));
memset(frm_dt,0,sizeof(frm_dt));
memset(to_dt,0,sizeof(to_dt));
memset(lim_amt,0,sizeof(lim_amt));
memset(ntry_dt,0,sizeof(ntry_dt));
memset(act_标志,0,sizeof(act_标志));
在调用strlen(ptr)
时,(ptr!=NULL&&i,ptr
指针未初始化,您调用未定义的行为:
/* there is random garbage in ptr, instead of a
* valid address to a nul-terminated string
*/
temp = (char*) malloc(strlen(ptr)+1);
也注意到,在C的赋值(或特别是
/* there is random garbage in ptr, instead of a
* valid address to a nul-terminated string
*/
temp = (char*) malloc(strlen(ptr)+1);
也注意到在C的赋值(或特别是
(gdb) run
Starting program: /tmp/test
Program received signal SIGSEGV, Segmentation fault.
0x0000000000400a00 in main () at test.c:14
14 temp = (char*)malloc(strlen(ptr)+1);
现在,您可以使用调试器检查变量
(gdb) p ptr
$1 = 0x0
当然,在
NULL
上调用strlen
是不允许的。当您查看实际的程序源时,您可以看到您在使用ptr之前未能初始化它(在本例中,它恰好得到的初始值为0)
(gdb) run
Starting program: /tmp/test
Program received signal SIGSEGV, Segmentation fault.
0x0000000000400a00 in main () at test.c:14
14 temp = (char*)malloc(strlen(ptr)+1);
现在,您可以使用调试器检查变量
(gdb) p ptr
$1 = 0x0
当然,在
NULL
上调用strlen
是不允许的。当你查看实际的程序源代码时,你会发现你在使用它之前没有初始化ptr(在本例中,它刚好得到的初始值是0)。除非你省略了一些代码,否则我很惊讶'temp=(char*)malloc(strlen(ptr)+1);'并没有破坏它,因为没有分配ptr。您的FGET也试图读取超过整个文件,因为'sz'保存整个文件的大小。顺便说一句,这就是Valgrind的作用。不过在这种情况下,任何调试器都可以。除非您省略了一些代码,否则我很惊讶'temp=(char*)malloc(strlen(ptr)+1)“;”并没有破坏它,因为没有分配ptr。您的FGET也试图读取超过整个文件的内容,因为“sz”保存了整个文件的大小。顺便说一句,这就是Valgrind的作用。不过在这种情况下,任何调试器都可以。@IlmariKaronen:是的,事实上,它导致了segfault,至少当我在这里运行程序时。@IlmariKaronen:是的,actually、 它导致了segfault,至少在我在这里运行程序时是这样。@itsniki:我不确定你是用什么初始化它的(你还没有发布更新的代码,我的读心技能也有点生疏),但你现在应该能够使用调试器找出它崩溃的地方了。char*ptr=“”;但这可能不是问题。.我正在进入fgets函数的while循环…@itsniki:好吧,花点时间学习如何使用任何可用的调试器,然后你可以使用它来找出你的程序有什么问题。@itsniki:我不确定你用什么初始化了它(您还没有发布更新的代码,我的读心术也有点生疏),但您应该能够使用调试器找出它现在崩溃的地方。char*ptr=“”;但这可能不是问题..我正在进入fgets函数的while循环…@itsniki:好吧,花点时间学习如何使用任何可用的调试器,然后你可以使用它来找出你的程序有什么问题。