免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3863 | 回复: 9
打印 上一主题 下一主题

[C] 请教:这个代码的segmentation fault 在哪里 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-11-09 20:45 |只看该作者 |倒序浏览
我做了一个代码,预期功能是从两个文件list1.txt和list2.txt中读取中文名单,然后从list2中找出list1里不存在的名字。每个名字占一行,由于是从excel拷贝过来到text中的,所以名字后面有个TAB。但这个代码运行后总是出现segmentation fault的提示。请问哪里出现了问题,谢谢!
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>

  5. #define SIZE 60
  6. #define MAX  20

  7. int main(void)
  8. {
  9.     char names_1[SIZE][MAX];
  10.     char names_2[SIZE][MAX];
  11.     char * pnames_1[SIZE], * pnames_2[SIZE];
  12.     char nms_1[SIZE][MAX];
  13.     char nms_2[SIZE][MAX];
  14.     char * pnms_1[SIZE], * pnms_2[SIZE];
  15.     char * fnd[SIZE];
  16.     int cnt_1 = 0, cnt_2 = 0, cnt_fnd = 0;
  17.     int i,j;
  18.     FILE *fp1, *fp2, *fp3;

  19.     if((fp1 = fopen("list1.txt", "r")) == NULL)
  20.     {
  21.         fputs("Error reading \"listing1.txt\".", stderr);
  22.         exit(1);
  23.     }
  24.     if((fp2 = fopen("list2.txt", "r")) == NULL)
  25.     {
  26.         fputs("Error reading \"listing2.txt\".", stderr);
  27.         exit(1);
  28.     }
  29.     if((fp3 = fopen("results.txt", "w")) == NULL)
  30.     {
  31.         fputs("Error writing \"results.txt\".", stderr);
  32.         exit(1);
  33.     }
  34.     while(cnt_1 <= SIZE && fgets(names_1[cnt_1], MAX, fp1) != NULL)
  35.     {
  36.         pnames_1[cnt_1] = names_1[cnt_1];
  37.         pnms_1[cnt_1] = nms_1[cnt_1];
  38.         cnt_1++;
  39.     }
  40.     while(cnt_2 <= SIZE && fgets(names_2[cnt_2], MAX, fp2) != NULL)
  41.     {
  42.         pnames_2[cnt_2] = names_2[cnt_2];
  43.         pnms_2[cnt_2] = nms_2[cnt_2];
  44.         cnt_2++;
  45.     }

  46.     for(i = 0; i < cnt_1; i++)
  47.     {
  48.         while(*(pnames_1[i]) && !isspace(*pnames_1[i]))
  49.         {
  50.             *pnms_1[i] = *pnames_1[i];
  51.             pnames_1[i]++;
  52.             pnms_1[i]++;
  53.         }
  54.         * pnms_1[i] = '\0';
  55.         puts(pnms_1[i]);
  56.     }
  57.     for(i = 0; i < cnt_2; i++)
  58.     {
  59.         while(*(pnames_2[i]) && !isspace(*pnames_2[i]))
  60.         {
  61.             *pnms_2[i] = *pnames_2[i];
  62.             pnames_2[i]++;
  63.             pnms_2[i]++;
  64.         }
  65.         * pnms_2[i] = '\0';
  66.         puts(pnms_2[i]);
  67.     }
  68.     for(i = 0; i < cnt_1; i++)
  69.         for(j = 0; j < cnt_2; j++)
  70.             if(strcmp(pnms_2[j], pnms_1[i]) != 0)
  71.             {
  72.                 fnd[i] = pnms_1[i];
  73.                 cnt_fnd++;
  74.             }
  75.     if(cnt_fnd > 0)
  76.     {
  77.         for(i = 0; i < cnt_fnd; i++)
  78.             fputs(fnd[i], fp3);
  79.         fprintf(fp3, "\n%d found.", cnt_fnd);
  80.     }
  81.     else
  82.         fputs("\nNo results found.", fp3);
  83.     printf("\n%d\n", cnt_fnd);
  84.     puts("\nDone!");
  85.     fclose(fp1);
  86.     fclose(fp2);
  87.     fclose(fp3);

  88.     return 0;
  89. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2013-11-09 22:19 |只看该作者
我修正了一些错误,但主要错误依然存在:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>

  5. #define SIZE 60
  6. #define MAX  20

  7. int main(void)
  8. {
  9.     char names_1[SIZE][MAX];
  10.     char names_2[SIZE][MAX];
  11.     char * pnames_1[SIZE], * pnames_2[SIZE];
  12.     char nms_1[SIZE][MAX];
  13.     char nms_2[SIZE][MAX];
  14.     char * pnms_1[SIZE], * pnms_2[SIZE];
  15.     char * fnd[SIZE];
  16.     int cnt_1 = 0, cnt_2 = 0, cnt_fnd = 0;
  17.     int i,j;
  18.     FILE *fp1, *fp2, *fp3;

  19.     if((fp1 = fopen("list1.txt", "r")) == NULL)
  20.     {
  21.         fputs("Error reading \"listing1.txt\".", stderr);
  22.         exit(1);
  23.     }
  24.     if((fp2 = fopen("list2.txt", "r")) == NULL)
  25.     {
  26.         fputs("Error reading \"listing2.txt\".", stderr);
  27.         exit(1);
  28.     }
  29.     if((fp3 = fopen("results.txt", "w")) == NULL)
  30.     {
  31.         fputs("Error writing \"results.txt\".", stderr);
  32.         exit(1);
  33.     }
  34.     while(cnt_1 <= SIZE && fgets(names_1[cnt_1], MAX, fp1) != NULL)
  35.     {
  36.         pnames_1[cnt_1] = names_1[cnt_1];
  37.         pnms_1[cnt_1] = nms_1[cnt_1];
  38.         cnt_1++;
  39.     }
  40.     while(cnt_2 <= SIZE && fgets(names_2[cnt_2], MAX, fp2) != NULL)
  41.     {
  42.         pnames_2[cnt_2] = names_2[cnt_2];
  43.         pnms_2[cnt_2] = nms_2[cnt_2];
  44.         cnt_2++;
  45.     }

  46.     for(i = 0; i < cnt_1; i++)
  47.     {
  48.         while(*(pnames_1[i]) && !isspace(*pnames_1[i]))
  49.         {
  50.             *pnms_1[i] = *pnames_1[i];
  51.             pnames_1[i]++;
  52.             pnms_1[i]++;
  53.         }
  54.         * pnms_1[i] = '\0';
  55.     }
  56.     for(i = 0; i < cnt_2; i++)
  57.     {
  58.         while(*(pnames_2[i]) && !isspace(*pnames_2[i]))
  59.         {
  60.             *pnms_2[i] = *pnames_2[i];
  61.             pnames_2[i]++;
  62.             pnms_2[i]++;
  63.         }
  64.         * pnms_2[i] = '\0';
  65.     }
  66.     for(i = 0; i < cnt_1; i++)
  67.         for(j = 0; j < cnt_2; j++)
  68.             if(strcmp(nms_1[i], nms_2[j]) == 0)
  69.             {
  70.                 fnd[i] = nms_1[i];
  71.                 cnt_fnd++;
  72.             }
  73.     if(cnt_fnd > 0)
  74.     {
  75.         for(i = 0; i < cnt_fnd; i++)
  76.         {
  77.             fputs(fnd[i], fp3);
  78.             putchar('\n');
  79.         }
  80.         fprintf(fp3, "\n%d found.", cnt_fnd);
  81.     }
  82.     else
  83.         fputs("\nNo results found.", fp3);
  84.     printf("\n%d\n", cnt_fnd);
  85.     puts("\nDone!");
  86.     fclose(fp1);
  87.     fclose(fp2);
  88.     fclose(fp3);

  89.     return 0;
  90. }
复制代码

论坛徽章:
0
3 [报告]
发表于 2013-11-13 10:53 |只看该作者
问一下楼主:在line41:     pnms_1[cnt_1] = nms_1[cnt_1];这句之前,对nms_1[cnt_1]赋初值了吗?

论坛徽章:
0
4 [报告]
发表于 2013-11-13 10:54 |只看该作者
问一下楼主:在line41:     pnms_1[cnt_1] = nms_1[cnt_1];这句之前,对nms_1[cnt_1]赋初值了吗?

论坛徽章:
0
5 [报告]
发表于 2013-11-13 19:05 |只看该作者
似乎问题出在fputs上

论坛徽章:
0
6 [报告]
发表于 2013-11-13 21:18 |只看该作者
回复 2# mcmay


    我在MacOS上运行了你的程序,自己建了小数据list1和list2,没有你说的错误,能执行。
你需要把数据也贴上来,看看。也许是数组越界错误,大数据才显现出来。

论坛徽章:
780
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
7 [报告]
发表于 2013-11-14 16:46 |只看该作者
回复 6# Hadron74
同意楼上的,我在linux也可以编译运行,
只是结果也不大对,只找出了第一个在list2不在list1的名字,
我用的是楼主2楼改进过的代码。


论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
8 [报告]
发表于 2013-11-14 17:15 |只看该作者
既然是必现,那还不简单……

windows,用你的vs单步执行,甚至只是用ide执行都行,它自己会告诉你到那行访问违例的;达到及格线的ide都允许你查看当时的调用栈以及变量值。

如果是linux,编译时加-g参数,然后ulimit -c unlimited允许吐core;等程序core掉,gdb 程序名 -c core.xxxx,然后bt看一下调用栈,或者用p看一下变量值。

有这些信息,结合程序逻辑稍微做一下推断……就这几行代码,不是太奇葩的情况都是秒杀……


先学会用好你手头的工具……尤其是在论坛提问时。这些工具的报告,或许你看起来是天书,但在别人眼里,很可能就是赤裸裸的答案……

论坛徽章:
5
2015年迎新春徽章
日期:2015-03-04 09:58:1115-16赛季CBA联赛之上海
日期:2016-01-18 13:24:3015-16赛季CBA联赛之佛山
日期:2016-01-27 10:13:0515-16赛季CBA联赛之北控
日期:2016-08-04 22:33:2115-16赛季CBA联赛之山西
日期:2016-08-06 15:49:33
9 [报告]
发表于 2013-11-15 09:49 |只看该作者
cnt_1 <= SIZE

pnames_1[cnt_1] = names_1[cnt_1];


等于可以吗?

fgets(names_1[cnt_1], MAX, fp1)
MAX可以吗?

论坛徽章:
1
CU十二周年纪念徽章
日期:2013-10-24 15:41:34
10 [报告]
发表于 2013-11-15 11:35 |只看该作者
调试core文件
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP