鱼C论坛

 找回密码
 立即注册
楼主: zwj.123

[已解决]在身份证中提取出生日期并排序,球球大佬帮忙看看为啥使用的qsort出现segemetionfault

[复制链接]
 楼主| 发表于 2022-11-28 20:47:25 | 显示全部楼层
zhangjinxuan 发表于 2022-11-28 20:42
我明天再试试吧,我都晕了

我也是,呜呜呜,晕了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-28 20:47:34 | 显示全部楼层
身份证18位
声明字符串必须是19个字符
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-28 20:48:40 | 显示全部楼层
jhq999 发表于 2022-11-28 20:47
身份证18位
声明字符串必须是19个字符

我怎么没想到!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-28 20:54:03 | 显示全部楼层
zwj.123 发表于 2022-11-28 20:47
我也是,呜呜呜,晕了

我开了开电脑,我真的没问题,你说你的排序方法是怎样的?从大到小还是神马?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-28 20:54:32 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. int compare(const void *e1,const void *e2)
  5. {
  6.    return *(int*)e1-*(int*)e2;
  7. }
  8. //身份证排序
  9. int main()
  10. {
  11.     char a[4][19]={'\0'};
  12.     int b[3]={'\0'};
  13.     int i,j,k;
  14. //输入
  15.     for(i=0;i<3;i++)
  16.     {
  17.         scanf("%s",a[i]);
  18.     }
  19.     //提取出生日期

  20.     //打印出生日期
  21.     for(i=0;i<3;i++)
  22.     {
  23.         strcpy(a[3],a[i]+6);
  24.         a[3][8]='\0';
  25.         printf("%s\n",a[3]);
  26.         sscanf(a[3],"%d",&b[i]);
  27.     }
  28. //排序
  29.     qsort(b,3,sizeof(int),compare);

  30.     for(i=0;i<3;i++)
  31.     {
  32.      printf("%d\n",b[i]);
  33.     }

  34.     return 0;
  35. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-28 21:04:10 | 显示全部楼层
zhangjinxuan 发表于 2022-11-28 20:54
我开了开电脑,我真的没问题,你说你的排序方法是怎样的?从大到小还是神马?

从小到大吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-28 21:08:48 | 显示全部楼层

我也是呜呜呜
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-28 21:23:29 | 显示全部楼层
zhangjinxuan 发表于 2022-11-28 20:54
我开了开电脑,我真的没问题,你说你的排序方法是怎样的?从大到小还是神马?

好家伙,这两个编译器简直了,有点毒
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-28 21:24:27 | 显示全部楼层
zhangjinxuan 发表于 2022-11-28 20:54
我开了开电脑,我真的没问题,你说你的排序方法是怎样的?从大到小还是神马?

我下次换着来算了,呜呜呜,头都晕了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-29 09:33:25 | 显示全部楼层
zwj.123 发表于 2022-11-28 21:24
我下次换着来算了,呜呜呜,头都晕了

可以给一个你输入出错的数据吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-29 09:43:10 | 显示全部楼层
本帖最后由 zhangjinxuan 于 2022-11-29 09:55 编辑
zwj.123 发表于 2022-11-28 20:47
我也是,呜呜呜,晕了


用这个就没事了,干嘛要用二维?
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. int compare(const void *e1,const void *e2)
  5. {
  6.    return strcmp((char*)e1,(char*)e2);;
  7. }
  8. //身份证排序
  9. int main()
  10. {
  11.     char a[3][18]={'\0'},b[3][18]={'\0'};
  12.     int i,j,k;
  13. //输入
  14.     for(i=0;i<3;i++)
  15.     {
  16.         scanf("%s",a[i]);
  17.     }
  18.     //提取出生日期
  19. for(j=0;j<3;j++)
  20.    {
  21.     for(i=6,k=0;i<14,k<8;i++,k++)
  22.     {
  23.         b[j][k]=a[j][i];
  24.     }
  25.     }
  26.     //打印出生日期
  27.     for(i=0;i<3;i++)
  28.     {

  29.         printf("%s\n",b[i]);
  30.     }
  31. //排序
  32.     qsort(b,3,sizeof(b[0]),compare);
  33.    
  34.     for(i=0;i<3;i++)
  35.     {
  36.      printf("%s\n",b[i]);
  37.     }

  38.     return 0;
  39. }
复制代码


还有,你输入的数据是什么,输出了什么,你预期输出什么,我很好奇
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-29 09:52:06 | 显示全部楼层
zwj.123 发表于 2022-11-28 20:38
呜呜呜,为啥,我换个编译器试试

我这边完全没有问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-12-1 19:41:08 | 显示全部楼层
zhangjinxuan 发表于 2022-11-29 09:33
可以给一个你输入出错的数据吗?

抱歉,这几天在上课,没注意看消息
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-1 19:42:00 | 显示全部楼层
zwj.123 发表于 2022-12-1 19:41
抱歉,这几天在上课,没注意看消息


没事

那么,你输入的数据是什么,输出了什么,你预期输出什么?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-12-1 19:52:56 | 显示全部楼层
zhangjinxuan 发表于 2022-11-29 09:43
用这个就没事了,干嘛要用二维?

1.身份证生日排序:用原本的一级指针没有问题
                           ,用二维指针出现了segemetion fault
2.字符串排序:这个嘛,我用一级指针,输入zhang,wang,li
                                                目的是从小到大排序 输出的li,zhang,wang
                                   用二维指针就正常了
我用的MobaXterm,编译的
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. int compare(const void *e1,const void *e2)
  5. {
  6. //    return strcmp(*(char**)e1,*(char**)e2);
  7.     return strcmp((char*)e1,(char*)e2);
  8. }
  9. int main()
  10. {
  11.     char**a;
  12.     char ch[100];
  13.     int n=3,i,j;
  14. //创建二维指针                  
  15.     a=(char**)malloc(n*sizeof(char*));
  16.     if(a==NULL)
  17.     {
  18.         free(a);
  19.         exit(1);
  20.     }
  21.     for(i=0;i<n;i++)
  22.     {
  23.         a[i]=(char*)malloc(100*sizeof(char));
  24.         if(a[i]==NULL)
  25.         {
  26.             for( j=0;j<=i;j++)
  27.                 free(a[j]);
  28.         }
  29.     }
  30.     //输入
  31.     for(i=0;i<n;i++)
  32.     {
  33.         scanf("%s",a[i]);
  34.     }
  35.    // 排序
  36.     qsort(a,n,sizeof(a[0]),compare);
  37.     //打印
  38.     for(i=0;i<n-1;i++)
  39.     {
  40.         printf("%s\n",a[i]);
  41.     }
  42.    
  43.     printf("%s",a[i]);
  44.     printf("\n");
  45.     // free掉
  46.     for(i=0;i<n;i++)
  47.     {
  48.         free(a[i]);
  49.     }
  50.     free(a);
  51.     return 0;
  52. }

复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-1 19:56:53 | 显示全部楼层
zwj.123 发表于 2022-12-1 19:52
1.身份证生日排序:用原本的一级指针没有问题
                           ,用二维指针出现了segemetio ...

我测试的结果却是不管是二维还是一维,输出的总是:
  1. li
  2. zhang
  3. wang
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-1 20:01:50 | 显示全部楼层
zwj.123 发表于 2022-12-1 19:52
1.身份证生日排序:用原本的一级指针没有问题
                           ,用二维指针出现了segemetio ...

不太建议在不是字符串常量的时候用指针,平常我都是搞二维数组的
试试这个:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. int compare(const void *e1, const void *e2) {
  5.     return strcmp((char*)e1, (char*)e2);
  6. }
  7. int main() {
  8.         char a[3][1001] = {'\0'};
  9.         for (int i = 0; i < 3; ++i)
  10.                 scanf("%s", &a[i]);
  11.     qsort(a, 3, sizeof(a[0]), compare);
  12.     for (int i = 0; i < 3; ++i)
  13.             printf("%s\n", a[i]);
  14.     return 0;
  15. }

复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-12-1 20:02:04 | 显示全部楼层
zhangjinxuan 发表于 2022-12-1 19:56
我测试的结果却是不管是二维还是一维,输出的总是:

应该是li
wang
zhang
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-1 20:02:42 | 显示全部楼层
zwj.123 发表于 2022-12-1 20:02
应该是li
wang
zhang

对啊,正确的应该是 li wang zhang,但是你的代码输出的好像是 li zhang wang
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-12-1 20:02:57 | 显示全部楼层
zwj.123 发表于 2022-12-1 20:02
应该是li
wang
zhang

要不加个联系方式吧,我解释解释,这个不能发图片,太难了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-23 01:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表