调试了好久,才发现是分配的内存大小问题,我还以为这一题不能使用stdlib库呢。ಠ_ಠ注意数组大小和malloc分配的内存一定要大!!!!否则会显示运行错误50!!!有什么问题可以在评论区指出一起讨论。
题目描述
对于一个字符串,将其后缀子串进行排序,例如grain
其子串有:
grain
rain
ain
in
n
然后对各子串按字典顺序排序,即:
ain,grain,in,n,rain
输入格式
每个案例为一行字符串。
输出格式
将子串排序输出
样例输入
grain banana
样例输出
ain grain in n rain a ana anana banana na nana
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int compare(char*,char*);
//void swap(char*,char*);
int main(){
char* temp;
char a[1000][1000];//这里分配的数组元素一定要够大,不然会显示运行错误50,试过500不行,1000就行了
char s[1000];
while(~scanf("%s",s)){
getchar();
int t=0;
for(int i=0;i<strlen(s);i++){//获取子串
int l=0;
for(int j=i;j<strlen(s);j++){
a[t][l++]=s[j];
}
a[t][l]='\0';//别忘末尾添加'\0'
t++;
}
for(int i=0;i<t;i++){//类似选择排序
int max=i;
for(int j=i+1;j<t;j++){
if(compare(a[max],a[j])){//手动比较,也可以strcmp库函数比较
max=j;
}
}
// swap(a[i],a[max]);
temp=(char*)malloc(1000*sizeof(char));//这里分配的内存一定要够大,不然会显示运行错误50
strcpy(temp,a[i]);
strcpy(a[i],a[max]);
strcpy(a[max],temp);
free(temp);
}
for(int i=0;i<t;i++)
printf("%s\n",a[i]);
}
}
//void swap(char* s1,char* s2){
// int l1=strlen(s1);
// int l2=strlen(s2);
// char* temp=(char*)malloc((l1+1)*sizeof(char));
// for(int i=0;i<l1;i++){
// temp[i]=s1[i];
// }
// temp[l1]='\0';
// for(int i=0;i<l2;i++){
// s1[i]=s2[i];
// }
// s1[l2]='\0';
// for(int i=0;i<l1;i++){
// s2[i]=temp[i];
// }
// s2[l1]='\0';
// free(temp);
//}
int compare(char* s1,char* s2){//手动比较,也可以strcmp函数比较
int l1=strlen(s1);
int l2=strlen(s2);
int i,j;
for(i=0,j=0;i<l1&&j<l2;i++,j++){
if(s1[i]>s2[j]){
return 1;
}
else if(s1[i]==s2[j]){
continue;
}
else{
return 0;
}
}
if(i==l1)
return 0;
else
return 1;
}