Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 解析文本文件时出现分段错误_C_Linux - Fatal编程技术网

C 解析文本文件时出现分段错误

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

我正在做一些简单的逻辑来解析逗号分隔的文本文件。当我给出sz+1时,我在最外层的while循环中得到了精确的分段错误。但是我使用了sizeof(str1)来代替sz+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的赋值(或特别是MalOC)中,铸造空洞指针是不必要的,不像C++中的.

在调用<代码> STLLN(PTR)时,<代码> PTR < /C>指针未初始化,调用未定义的行为:

/* there is random garbage in ptr, instead of a 
 * valid address to a nul-terminated string
 */
temp = (char*) malloc(strlen(ptr)+1);

也注意到在C的赋值(或特别是 MALOC )中的铸造空洞指针是不必要的,与C++不同。

< P>使用调试器。在添加一些<代码> >包含<代码> >,并将<代码>成功< /代码>改为<代码> ExITION < /COD> >,这里是GDB给出的:

(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:好吧,花点时间学习如何使用任何可用的调试器,然后你可以使用它来找出你的程序有什么问题。