C语言程序,哪里错了,显示的是段错误,题目是01串排序

将01串首先按长度排序,长度相同时,按1的个数从少到多进行排序,1的个数相同时再按ASCII码值排序。
#include<stdio.h>
#include<string.h>
void change(char *x,char *y)
{
int a,i;
char c;
a=strlen(x);
if (strlen(y)>a) a=strlen(y);
for(i=0;i<a;i++)
{
c=x[i];
x[i]=y[i];
y[i]=c;
}
}
main()
{
int b[100],i,j,k,c,t,h;
char a[100];
char *d[100];
d[k]=&a[k];
while(scanf("%c",&a[k])!=EOF)
{
b[k]=strlen(d[k]);
k=k+1;
}
for(i=1;i<=k-1;i++)
{
for(j=1;j<=k-i;j++)
{
if(b[j]>b[j+1])
{
change(d[j],d[j+1]);
t=b[j];
b[j]=b[j+1];
b[j+1]=t;
}
if(b[j]==b[j+1])
{
while(b[j]!=0)
{
h=h+1;
b[j]=b[j]&(b[j]-1);
}
while(b[j+1])
{
c=c+1;
b[j+1]=b[j+1]&(b[j+1]-1);
}
if(c>h)
{
t=b[j];
b[j]=b[j+1];
b[j+1]=t;
change(d[j],d[j+1]);
}
else if(c==h)
{
if(a[j+1]<a[j])
{
t=b[j];
b[j]=b[j+1];
b[j+1]=t;
change(d[j],d[j+1]);
}
}
}
}
}
for(i=1;i<=k;i++)
{
printf("%s\n",a[i]);
}
}

第1个回答  2017-10-31
改成这样:
#include<stdio.h>
#include<string.h>
void change(char *x,char *y)
{
int a,i;
char c;
a=strlen(x);
if (strlen(y)>a) a=strlen(y);
for(i=0;i<a;i++)
{
c=x[i];
x[i]=y[i];
y[i]=c;
}
}
int main()
{
int b[100],i,j,k=1,c,t,h;
//char a[100];
char d[100][100];
while(k<100&&(scanf("%s",d[k])!=EOF))
{
b[k]=strlen(d[k]);
k=k+1;
}
for(i=1;i<=k-1;i++)
{
for(j=1;j<=k-i-1;j++)
{
if(b[j]>b[j+1])
{
change(d[j],d[j+1]);
t=b[j];
b[j]=b[j+1];
b[j+1]=t;
}
if(b[j]==b[j+1])
{
h=0;
t=0;
while(d[j][t]!=0)
{
if(d[j][t++]=='1')
h=h+1;
}
c=0;
t=0;
while(d[j+1][t]!=0)
{
if(d[j+1][t++]=='1')
c=c+1;
}
if(c<h)
{
t=b[j];
b[j]=b[j+1];
b[j+1]=t;
change(d[j],d[j+1]);
}
else if(c==h)
{
if(strcmp(d[j+1],d[j])<0)
{
t=b[j];
b[j]=b[j+1];
b[j+1]=t;
change(d[j],d[j+1]);
}
}
}
}
}
for(i=1;i<k;i++)
{
printf("%s\n",d[i]);
}
return 0;
}本回答被提问者采纳
相似回答