段错误(核心已转移)

D_GN 2018-05-10 04:34:54
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include <stdbool.h>
#include<string.h>

int main(int argc,char *argv[])
{
int arg;
char data[20]={0};
bool flag=false; //判断输入Id是否存在
FILE *fp;

/*$./student -i 101 zhangsan studentinfo.txt
选项i完成插入功能,如果101已经存在,则报错,不执行插入操作.如果101不存在,
把指定参数的内容追加到文件的末尾新的一行*/
if(!strcmp(argv[1],"-i")){
fp=fopen("studentinfo.txt","a+");
while(!feof(fp)){
fgets(data,20,fp);
if(strstr(data,argv[2])!=NULL) flag=true;
}
if(flag==true) printf("该数据已存在");
else{
fseek(fp,0,2);
fprintf(fp,"%s%s",argv[2],argv[3]);
}
fclose(fp);
}

/*$./student -d 101 studentinfo.txt
选项d完成删除操作,如果学号101不存在,退出程序并给出提示,
如果学号101存在,则删除该行,并给出相应提示*/
if(!strcmp(argv[1],"-d")){
fp=fopen("studentinfo.txt","rb+");
while(!feof(fp)){
fgets(data,20,fp);
if(strstr(data,argv[2])!=NULL) flag=true;
}
if(flag=true){
FILE *ff;
char c[20];
ff=fopen("temp.txt","a");
while(fgets(c,20,fp)){
if(strcmp(c,argv[2])!=0) fputs(c,ff);
}
remove("studentinfo.txt");
rename("temp.txt",argv[3]);
printf("删除成功");
fclose(ff);
}
else printf("这行数据不存在");
fclose(fp);

}

/*$./student -s 101 studentinfo.txt
选项s完成查询操作,如果学号101不存在,退出程序并给出提示,
如果学号101存在,则把该行数据显示出来*/
if(!strcmp(argv[1],"-s")){
fopen("studentinfo.txt","rb+");
char data1[20]={0};
while(!feof(fp)){
fgets(data,20,fp);
if(strstr(data,argv[2])!=NULL){
flag=true;
memcpy(data1,data,strlen(data)+1);
} ;
}
if(flag=true) printf("%s",data1);
if(flag=false) printf("这行数据不存在");
}
}

大佬们问下这段程序出现段错误(核心已转移)是什么问题?找了半天找不到
...全文
951 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-05-11
  • 打赏
  • 举报
回复
引用 3 楼 dear_Alice_moon 的回复:
[quote=引用 2 楼 zhao4zhong1 的回复:] Windows: 崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。 Linux: 进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈,内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件,参考“ulimit -c core文件最大块大小”命令
赵老师,好厉害啊,膜拜一下。 其实你写的是啥,我都有些看不懂,在这里膜拜吹捧你一下。 (^__^) 现在该走了,下班了! 好累,一直996的工作,我都想辞职了。 [/quote] 一言以蔽之:不明觉厉,人生苦短。
赵4老师 2018-05-11
  • 打赏
  • 举报
回复
就是你前面的blabla……,浓缩成一句话就是“不明觉厉,人生苦短。”
_明月 2018-05-11
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
[quote=引用 3 楼 dear_Alice_moon 的回复:] [quote=引用 2 楼 zhao4zhong1 的回复:] Windows: 崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。 Linux: 进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈,内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件,参考“ulimit -c core文件最大块大小”命令
赵老师,好厉害啊,膜拜一下。 其实你写的是啥,我都有些看不懂,在这里膜拜吹捧你一下。 (^__^) 现在该走了,下班了! 好累,一直996的工作,我都想辞职了。 [/quote] 一言以蔽之:不明觉厉,人生苦短。[/quote] 赵老师能不能说的“通俗易懂”些? 您说的“一言以蔽之:不明觉厉,人生苦短。” ,我个人资质鲁钝,无法理解!
_明月 2018-05-10
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
Windows: 崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。 Linux: 进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈,内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件,参考“ulimit -c core文件最大块大小”命令
赵老师,好厉害啊,膜拜一下。 其实你写的是啥,我都有些看不懂,在这里膜拜吹捧你一下。 (^__^) 现在该走了,下班了! 好累,一直996的工作,我都想辞职了。
赵4老师 2018-05-10
  • 打赏
  • 举报
回复
Windows: 崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。 Linux: 进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈,内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件,参考“ulimit -c core文件最大块大小”命令
自信男孩 2018-05-10
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include <stdbool.h>
#include<string.h>
#include <errno.h>

int main(int argc,char *argv[])
{
    int arg;
    char data[20]={0};
    bool flag=false;   //判断输入Id是否存在
    FILE *fp;

    if (argc < 2)
        return 0;

    /*$./student -i 101 zhangsan studentinfo.txt
      选项i完成插入功能,如果101已经存在,则报错,不执行插入操作.如果101不存在,
      把指定参数的内容追加到文件的末尾新的一行*/
    if(!strcmp(argv[1],"-i")){
        //fp = fopen("studentinfo.txt","a+");
        fp = fopen("studentinfo.txt","r");
        if (!fp) {
            printf("Open file error: %s\n", strerror(errno));
            exit(0);
        }
        while(!feof(fp)){
            fgets(data,20,fp);
            if(strstr(data,argv[2])!=NULL) flag=true;
        }
        if(flag==true)
            printf("该数据已存在");
        else{
            fseek(fp,0,2);
            fprintf(fp,"%s%s",argv[2],argv[3]);
        }
        fclose(fp);
    }

    /*$./student -d 101  studentinfo.txt
      选项d完成删除操作,如果学号101不存在,退出程序并给出提示,
      如果学号101存在,则删除该行,并给出相应提示*/
    if(!strcmp(argv[1],"-d")){
        fp=fopen("studentinfo.txt","rb+");
        if (!fp) {
                printf("Open file error: %s\n", strerror(errno));
                exit(0);
        }
        while(!feof(fp)){
            fgets(data,20,fp);
            if(strstr(data,argv[2])!=NULL)
                flag=true;
        }
        //if(flag=true){
        if(flag == true){
            FILE *ff;
            char c[20];
            //ff=fopen("temp.txt","a");
            ff=fopen("temp.txt","r");
            if (!ff) {
                printf("Open file error: %s\n", strerror(errno));
                exit(0);
            }
            while(fgets(c,20,fp)){
                if(strcmp(c,argv[2])!=0) fputs(c,ff);
            }
            remove("studentinfo.txt");
            rename("temp.txt",argv[3]);
            printf("删除成功");
            fclose(ff);
        }
        else
            printf("这行数据不存在");
        fclose(fp);

    }

    /*$./student -s 101  studentinfo.txt
      选项s完成查询操作,如果学号101不存在,退出程序并给出提示,
      如果学号101存在,则把该行数据显示出来*/
    if(!strcmp(argv[1],"-s")){
        fp = fopen("studentinfo.txt","rb+");
        if (!fp) {
            printf("Open file error: %s\n", strerror(errno));
            exit(0);
        }
        char data1[20]={0};
        while(!feof(fp)){
            fgets(data,20,fp);
            if(strstr(data,argv[2])!=NULL){
                flag=true;
                memcpy(data1,data,strlen(data)+1);
            }
        }
        //if(flag=true)
        if(flag==true)
            printf("%s",data1);
        //if(flag=false)
        if(flag==false)
            printf("这行数据不存在");
    }
}
参考一下吧,问题可以对照找一下; 若以追加的形式打开文件,文件指针指向文件末尾,这样试读不到数据的。 文件指针需要判断返回值的,即文件是否打开成功。 文件指针需要接收fopen的,有一个if中,只有fopen,并没有得到它的返回值。 问题建议一一对比查找一下

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧