我遇见的第一个报错Segmentation fault问题

来源:互联网 发布:什么是软件外包公司 编辑:程序博客网 时间:2024/04/30 08:37

1、函数功能: 将用户文件夹 /etc/passwd 中的用户名和路径选出来并放在一个结构体中,然后将结构体放在一个新的文件中去。


2、出现的错误:我在写完代码之后一直有Segmentation fault这样的错误,查找很久都没发现,最后还是王老师帮忙找到的问题处在33行    if(fp_n==NULL){,    其中的“==”我写了一个,导致的结果是花费了我今天一晚上的时间去找错,切记今后这样写   if(NULL==a),如果忘记==,可以报错,切记切记!


3、还有一个小问题, 40                 strcpy(str,p);       41                 token=strtok(str,":");,在这两行中,本来我以为str只是起了过度的作用,用着多余,我尝试不用它,可是删除之后,一直报错,后来有改了过来。

错误原因:p本来指向buf,strtok函数在调用p后,p指针就乱了,不知道指向buf哪里了,所以就出现了错误,这是strtok函数自身的原因。所以str这个数组在这里还是不能不用的。

1 #include <stdio.h>

  2 #include <string.h>
  3 
  4 typedef struct info
  5 {
  6         char name[20];
  7         char road[50];
  8 }stu_info;
  9 int main(void)
 10 {
 11         FILE *fp;
 12         FILE *fp_in;
 13         char buf[256];
 14         char *p;
 15         char str[256];
 16         char *token;
 17         int i=0,j=0;
 18         stu_info st[50];
 19 
 20         fp=fopen("/etc/passwd","r");
 21         if(fp==NULL){
 22                 printf("open file fail!\n");
 23                 return 1;
 24         }
 25 
 26         fp_in=fopen("passwd_name_road.txt","w");
 27         if(fp_in==NULL){
 28                 perror("open:");
 29                 return ;
 30         }
 31 
 32 /*      fp_n=fopen("name","w");

 

33         if(fp_n==NULL){
 34                 printf("open file fail!\n");
 35                 return 1;
 36         }
 37         fputs("wangsong",fp_n);
 38 */
 39         while((p=fgets(buf,256,fp))!=NULL){
 40                 strcpy(str,p);
 41                 token=strtok(str,":");

 42                 strcpy(st[j].name,token);//  printf("%s\n",token);
 43                 while((token=strtok(NULL,":"))!=NULL){
 44                         i=i+1;
 45                         if(i==5)
 46                                 strcpy(st[j].road,token);       //printf("%s\n",token);
 47                 }
 48                 i=0;
 49                 j++;
 50         }
 51         for(i=0;i<j;i++)
 52                 printf("st[%d].name:%s\t\t\t\t\
 53                 st[%d].road:%s\n",i,\
 54                 st[i].name,i,st[i].road);

 56         printf("aaaaaaaaaaaaaaaaa\n");
 57 
 58 /*              printf("%s",p);*/
 59         printf("st[0].name:%s\tst[0].road:%s\n",st[0].name,st[0].road);
 60         rewind(fp_in);
 61         printf("stu_info length:%d\n",sizeof(int));
 62         fwrite(st,sizeof(stu_info),1,fp_in);
 63         printf("bbbbbbbbbbbbbbbbbbb\n");
 64         fclose(fp_in);
 65         fclose(fp);
 66 
 67         return 0;
 68 }






原创粉丝点击