| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1254 人关注过本帖
标题:求助! 段错误,不知道错在哪,求高手指导
只看楼主 加入收藏
s58417632
Rank: 2
等 级:论坛游民
帖 子:17
专家分:11
注 册:2010-5-28
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:8 
求助! 段错误,不知道错在哪,求高手指导
编译提示段错误 找了半天没找出错误在哪
要求是将一个TXT文件以CLASS:为分类进行分类,归档到不同的TXT文件中去,去掉不需要的内容.
我把需要归档的原TXT文档和我写的代码都打包,请各位高手不吝赐教!! 谢谢
归档.rar (28.11 KB)



#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char *strstrip(char *s)              /* 功能是去掉字符串中的空格*/
{
    size_t size;
    char *end;

    if(!size)
        return s;
        end = s + size -1;
    while( end>=s && isspace(*end))
        end--;
        *(end+1)='\0';

    while(*s && isspace(*s))
        s++;
        return s;
}
int main(int argc,char * argv[])
{
    FILE *fp = fopen(argv[1],"r");           /*传参文件名*/
    FILE *fpecid = fopen("ECID.txt","w+");   /*打开CLASS:  ECID归档目标文件*/
    FILE *fpceid = fopen("CEID.txt","w+");   /*打开CLASS:  CEID归档目标文件*/
    FILE *fpsvid = fopen("SVID.txt","w+");   /*打开CLASS:  SVID归档目标文件*/
    FILE *fpalid = fopen("ALID.txt","w+");   /*打开CLASS:  ALID归档目标文件*/
    FILE *fpdvval = fopen("DVVAL.txt","w+"); /*打开CLASS:  DVVAL归档目标文件*/
    FILE *fplimit = fopen("LIMIT.txt","w+"); /*打开CLASS:  LIMIT归档目标文件*/
    if(fp<0){                                /*判断是否打开传参文件成功*/
        perror("fopen err");
        return -1;
    }
    int flag = -1;                          /*设置一个标志,将不是CLASS 开头的字符串输入到相应的内容下面去*/
    char buf[1000] = {0};
    char * tmp = NULL;
    while(tmp = fgets(buf,1000,fp)){
        if( strcmp(buf,"*") == 0 || strcmp(buf,"#")==0){      /*将包涵"*" 和 "#"的内容去掉*/
            continue;}
        else if(strstr(buf,"CLASS:")) {                       /*找到关键词"CLASS:"开头的这一行*/
            char *tmp_buf = malloc(strlen(buf)+1);            /*申请内存空间*/
            char *bak_buf = tmp_buf;                          /*为释放空间做预留*/
            memset(tmp_buf,0,(strlen(buf)));                  /*清空*/
            memcpy(tmp_buf,buf,strlen(buf));                  /*复制*/
            strsep (&tmp_buf,":");                            /*将 ":" 之后的内容复制到tmp_buf中去*/
            char *type = strstrip(tmp_buf);                   /*去掉 tmp_buf中字符串的空格*/
            if(strcmp(type,"ECID")==0)                        /*做类型比较,将这一行内容归类到相应文档中去*/
                flag = 0;
                fputs(buf,fpecid);
            if(strcmp(type,"SVID")==0)
                flag = 1;
                fputs(buf,fpsvid);
            if(strcmp(type,"CEID")==0)
                flag = 2;
                fputs(buf,fpceid);
            if(strcmp(type,"ALID")==0)
                flag = 3;
                fputs(buf,fpalid);
            if(strcmp(type,"DVVAL")==0)
                flag = 4;
                fputs(buf,fpdvval);
            if(strcmp(type,"LIMIT")==0)
                flag = 5;
                fputs(buf,fplimit);
            free(bak_buf);                              /*释放空间*/
        } else {                                       /*将不是以CLASS开头的内容复制到相对应的内容下面去*/
            switch(flag) {
            case 0: fputs(buf,fpecid);break;
            case 1: fputs(buf,fpsvid);break;
            case 2: fputs(buf,fpceid);break;
            case 3: fputs(buf,fpalid);break;
            case 4: fputs(buf,fpdvval);break;
            case 5: fputs(buf,fplimit);break;
            default: printf("找不到可归类文档!\n");break;
            }
        }
    }
    fclose(fp);
    fclose(fpecid);
    fclose(fpsvid);
    fclose(fpceid);
    fclose(fpalid);
    fclose(fpdvval);
    fclose(fplimit);
    return 0;
}

[ 本帖最后由 s58417632 于 2010-5-30 13:22 编辑 ]
搜索更多相关主题的帖子: 指导 
2010-05-30 12:29
s58417632
Rank: 2
等 级:论坛游民
帖 子:17
专家分:11
注 册:2010-5-28
收藏
得分:0 
沉了.... 顶起
2010-05-30 12:56
s58417632
Rank: 2
等 级:论坛游民
帖 子:17
专家分:11
注 册:2010-5-28
收藏
得分:0 
写了注释,上传了源文件,希望能有高手解答
2010-05-30 13:23
bccn250
Rank: 5Rank: 5
等 级:职业侠客
帖 子:154
专家分:379
注 册:2010-5-25
收藏
得分:7 
我用vc6 找到3个错误,我只能改好两个,还有一个不知道你那可不可以通过,你的编译器是不是更高版本的?

我只对一些编译无法通过的地方作些修改,至于函数实现方面,如果有问题到时再说

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#include<ctype.h>                    //上百度上搜了一下,用isspace函数要包函这个头文件

char *strstrip(char *s)              /* 功能是去掉字符串中的空格*/
{
    size_t size;
    char *end;

    if(!size)
        return s;
        end = s + size -1;
    while( end>=s && isspace(*end))    //就是这里,上面的头文件
        end--;
        *(end+1)='\0';

    while(*s && isspace(*s))            //还有这里,也是上面的头文件
        s++;
        return s;
}
int main(int argc,char * argv[])
{
    FILE *fp = fopen(argv[1],"r");           /*传参文件名*/
    FILE *fpecid = fopen("ECID.txt","w+");   /*打开CLASS:  ECID归档目标文件*/
    FILE *fpceid = fopen("CEID.txt","w+");   /*打开CLASS:  CEID归档目标文件*/
    FILE *fpsvid = fopen("SVID.txt","w+");   /*打开CLASS:  SVID归档目标文件*/
    FILE *fpalid = fopen("ALID.txt","w+");   /*打开CLASS:  ALID归档目标文件*/
    FILE *fpdvval = fopen("DVVAL.txt","w+"); /*打开CLASS:  DVVAL归档目标文件*/
    FILE *fplimit = fopen("LIMIT.txt","w+"); /*打开CLASS:  LIMIT归档目标文件*/
    if(fp<0){                                /*判断是否打开传参文件成功*/
        perror("fopen err");
        return -1;
    }
    int flag = -1;                          /*设置一个标志,将不是CLASS 开头的字符串输入到相应的内容下面去*/
    char buf[1000] = {0};
    char * tmp = NULL;
    while(tmp = fgets(buf,1000,fp)){
        if( strcmp(buf,"*") == 0 || strcmp(buf,"#")==0){      /*将包涵"*" 和 "#"的内容去掉*/
            continue;}
        else if(strstr(buf,"CLASS:")) {                       /*找到关键词"CLASS:"开头的这一行*/
            char *tmp_buf = /*(char *)*/malloc(strlen(buf)+1);            /*申请内存空间*/ //申请空间没有进行转换,如果要的话把我的注释去掉吧
            char *bak_buf = tmp_buf;                          /*为释放空间做预留*/
            memset(tmp_buf,0,(strlen(buf)));                  /*清空*/
            memcpy(tmp_buf,buf,strlen(buf));                  /*复制*/
            strsep (&tmp_buf,":");                             /*将 ":" 之后的内容复制到tmp_buf中去*/    //我用vc6 编译说这里会有错,说是找不到 strsep 这个函数,可上网搜了一下,是包函 <string.h> 这个头文件没错啊,可能是我的编译器太老了,你自己试试看吧
            char *type = strstrip(tmp_buf);                   /*去掉 tmp_buf中字符串的空格*/
            if(strcmp(type,"ECID")==0)                        /*做类型比较,将这 一行内容归类到相应文档中去*/
                flag = 0;
                fputs(buf,fpecid);
            if(strcmp(type,"SVID")==0)
                flag = 1;
                fputs(buf,fpsvid);
            if(strcmp(type,"CEID")==0)
                flag = 2;
                fputs(buf,fpceid);
            if(strcmp(type,"ALID")==0)
                flag = 3;
                fputs(buf,fpalid);
            if(strcmp(type,"DVVAL")==0)
                flag = 4;
                fputs(buf,fpdvval);
            if(strcmp(type,"LIMIT")==0)
                flag = 5;
                fputs(buf,fplimit);
            free(bak_buf);                              /*释放空间*/
        } else {                                       /*将不是以CLASS开头的内容复制到相对应的内容下面去*/
            switch(flag) {
            case 0: fputs(buf,fpecid);break;
            case 1: fputs(buf,fpsvid);break;
            case 2: fputs(buf,fpceid);break;
            case 3: fputs(buf,fpalid);break;
            case 4: fputs(buf,fpdvval);break;
            case 5: fputs(buf,fplimit);break;
            default: printf("找不到可归类文档!\n");break;
            }
        }
    }
    fclose(fp);
    fclose(fpecid);
    fclose(fpsvid);
    fclose(fpceid);
    fclose(fpalid);
    fclose(fpdvval);
    fclose(fplimit);
    return 0;
}


[ 本帖最后由 bccn250 于 2010-5-30 14:32 编辑 ]
2010-05-30 14:14
s58417632
Rank: 2
等 级:论坛游民
帖 子:17
专家分:11
注 册:2010-5-28
收藏
得分:0 
感谢bccn250,改完后编译能够通过 但是运行的时候报段错误,我用的是ubuntu10.0.4自带的GCC编译器,在linux下进行的操作,可能是程序实现的时候出了问题,但是没找到问题出在哪,一般段错误都是指针使用错误,找了半天没找到到底哪用错了,难道要重写 - -!
2010-05-30 14:49
ubuntulover
Rank: 4
等 级:业余侠客
帖 子:77
专家分:256
注 册:2010-4-9
收藏
得分:7 
会gdb吗?设个断点,一步一步调试一下就行了
2010-05-30 15:59
s58417632
Rank: 2
等 级:论坛游民
帖 子:17
专家分:11
注 册:2010-5-28
收藏
得分:0 
不会...我比较菜.
我现在用#if 0
#endif 排查中 发现错误出现在while语句开始 char *type = strstrip(tmp_buf);  这行之前, 估计是内存溢出问题 但是还是没找到到底哪溢出了.
2010-05-30 16:16
s58417632
Rank: 2
等 级:论坛游民
帖 子:17
专家分:11
注 册:2010-5-28
收藏
得分:0 
找到问题了,原来在strstrip这个函数里 我size没有初始化  - -!
2010-05-30 19:54
s58417632
Rank: 2
等 级:论坛游民
帖 子:17
专家分:11
注 册:2010-5-28
收藏
得分:0 
加了个size = strlen(s); 就出我想要的结果了
2010-05-30 19:55
快速回复:求助! 段错误,不知道错在哪,求高手指导
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.059874 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved