在身份证中提取出生日期并排序,球球大佬帮忙看看为啥使用的qsort出现segemetionfault
#include <stdio.h>#include <stdlib.h>
#include <string.h>
int compare(const void *e1,const void *e2)
{
return strcmp(*(char **)e1,*(char **)e2);
}
//身份证排序
int main()
{
char a={'\0'},b={'\0'};
int i,j,k;
//输入
for(i=0;i<3;i++)
{
scanf("%s",a);
}
//提取出生日期
for(j=0;j<3;j++)
{
for(i=6,k=0;i<14,k<8;i++,k++)
{
b=a;
}
}
//打印出生日期
for(i=0;i<3;i++)
{
printf("%s\n",b);
}
//排序
qsort(b,3,sizeof(b),compare);
for(i=0;i<3;i++)
{
printf("%s\n",b);
}
return 0;
}
本帖最后由 zhangjinxuan 于 2022-11-28 19:28 编辑
比较函数写的有点问题啊
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int compare(const void *e1,const void *e2)
{
return strcmp((char*)e1,(char*)e2); //应该要这么写
}
int main()
{
char a={'\0'},b={'\0'};
int i,j,k;
for(i=0;i<3;i++)
{
scanf("%s",a);
}
for(j=0;j<3;j++)
{
for(i=6,k=0;i<14,k<8;i++,k++)
{
b=a;
}
}
for(i=0;i<3;i++)
{
printf("%s\n",b);
}
qsort(b,3,sizeof(b),compare);
for(i=0;i<3;i++)
{
printf("%s\n",b);
}
return 0;
} 如果像你这么写:
strcmp(*(char **)e1,*(char **)e2);
我们来解析一下, (char*) e1 就可以把 void * 的 e1 转换成 char * 的 e1,这时又来了一个星号,意思就是 e1 的第一个字符,所以 (char**) e1 返回的就是一个 char
之后如果你再对一个 char 进行解引用是不是就段错误了?
正确的:
strcmp((char*)e1,(char*)e2); zhangjinxuan 发表于 2022-11-28 19:26
比较函数写的有点问题啊
那么为啥这个给字符串排序用您那种办法就不行捏?用我这种才正确,我有点懵了,呜呜呜
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int compare(const void *e1,const void *e2)
{
return strcmp(*(char**)e1,*(char**)e2);
}
int main()
{
char**a;
char ch;
int n=10,i,j;
//创建二维指针
a=(char**)malloc(n*sizeof(char*));
if(a==NULL)
{
free(a);
exit(1);
}
for(i=0;i<n;i++)
{
a=(char*)malloc(100*sizeof(char));
if(a==NULL)
{
for( j=0;j<=i;j++)
free(a);
}
}
//输入
for(i=0;i<n;i++)
{
scanf("%s",a);
}
// 排序
qsort(a,n,sizeof(a),compare);
//打印
for(i=0;i<n-1;i++)
{
printf("%s\n",a);
}
printf("%s",a);
printf("\n");
// free掉
for(i=0;i<n;i++)
{
free(a);
}
free(a);
return 0;
}
zwj.123 发表于 2022-11-28 19:46
那么为啥这个给字符串排序用您那种办法就不行捏?用我这种才正确,我有点懵了,呜呜呜
看看3楼,我发了更详细的解释 zwj.123 发表于 2022-11-28 19:46
那么为啥这个给字符串排序用您那种办法就不行捏?用我这种才正确,我有点懵了,呜呜呜
(char*)e1 已经是一个字符指针(字符串),不用写这么麻烦 zhangjinxuan 发表于 2022-11-28 19:44
如果像你这么写:
我们来解析一下, (char*) e1 就可以把 void * 的 e1 转换成 char * 的 e1,这时又来了 ...
我可能有点笨哈哈,很抱歉,可以麻烦你一下在解释下嘛,我没怎么看明白,如果您没空就算了吧。 zhangjinxuan 发表于 2022-11-28 19:57
(char*)e1 已经是一个字符指针(字符串),不用写这么麻烦
但是我如果不用二维指针那种办法他也有问题,呜呜呜 zwj.123 发表于 2022-11-28 20:06
我可能有点笨哈哈,很抱歉,可以麻烦你一下在解释下嘛,我没怎么看明白,如果您没空就算了吧。
不好意思,说错了,你想一想,strcmp的参数是什么,是char*对吧,所以只要转换成char*就可以了,不用写这么麻烦,现在用手机,不好操作,解释有点不好写,不好意思 zwj.123 发表于 2022-11-28 20:07
但是我如果不用二维指针那种办法他也有问题,呜呜呜
神马?我的没有报错? zwj.123 发表于 2022-11-28 20:07
但是我如果不用二维指针那种办法他也有问题,呜呜呜
我这么写是可以通过的
strcmp((char*)e1,(char*)e2) zwj.123 发表于 2022-11-28 20:07
但是我如果不用二维指针那种办法他也有问题,呜呜呜
是什么就转什么类型,不要写的很麻烦,因为strcmp的参数本来就是char*,就可以不用二维指针了 zhangjinxuan 发表于 2022-11-28 20:10
不好意思,说错了,你想一想,strcmp的参数是什么,是char*对吧,所以只要转换成char*就可以了,不用写这 ...
没事的,哈哈 zwj.123 发表于 2022-11-28 20:30
没事的,哈哈
好了,你还有什么疑问吗? zhangjinxuan 发表于 2022-11-28 20:33
好了,你还有什么疑问吗?
还是很疑惑{:5_100:} 就是这个代码,不用这种办法它排序出来就有问题,呜呜呜
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define n 3
int compare(const void *e1,const void *e2)
{
return strcmp(*(char**)e1,*(char**)e2);
}
int main()
{
char**a;
char ch;
int i,j;
//创建二维指针
a=(char**)malloc(n*sizeof(char*));
if(a==NULL)
{
free(a);
exit(1);
}
for(i=0;i<n;i++)
{
a=(char*)malloc(100*sizeof(char));
if(a==NULL)
{
for( j=0;j<=i;j++)
free(a);
}
}
//输入
for(i=0;i<n;i++)
{
scanf("%s",a);
}
// 排序
qsort(a,n,sizeof(a),compare);
//打印
for(i=0;i<n-1;i++)
{
printf("%s\n",a);
}
printf("%s",a);
printf("\n");
// free掉
for(i=0;i<n;i++)
{
free(a);
}
free(a);
return 0;
}
zhangjinxuan 发表于 2022-11-28 20:12
我这么写是可以通过的
strcmp((char*)e1,(char*)e2)
呜呜呜,为啥,我换个编译器试试 zwj.123 发表于 2022-11-28 20:36
就是这个代码,不用这种办法它排序出来就有问题,呜呜呜
神马玩意儿?我的没问题? zhangjinxuan 发表于 2022-11-28 20:12
我这么写是可以通过的
strcmp((char*)e1,(char*)e2)
的确可以通过的,但是它排序后的结果有问题,呜呜呜{:5_100:} zwj.123 发表于 2022-11-28 20:41
的确可以通过的,但是它排序后的结果有问题,呜呜呜
我明天再试试吧,我都晕了