c语言怎么不用strcmp按字典顺序对多个字符串排序
要用指针数组,下面是我写的,找不到错误,,希望各位大神帮我把它改好#include<stdio.h>#include<string.h>intmin(inta,intb)...
要用指针数组,下面是我写的,找不到错误,,希望各位大神帮我把它改好
#include<stdio.h>
#include<string.h>
int min(int a,int b)
{ if(a>b) return b;
else return a;}
void main()
{
char *str[]={"turbo c","turbo pascal","basic","dbase","lisp","fortran"};
int i,j,k=0,l,n;
char *temp;
scanf("%d",&n);
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
l=min(strlen(str[i]),strlen(str[j]));
for(;k<l;k++)
{
if(*(str[i]+k)!=*(str[j]+k))
{
if(*(str[i]+k)>*(str[j]+k))
{
temp=str[j];
str[j]=str[i];
str[i]=temp;
}
break;
}
}
}
}
for(i=0;i<n;i++)
printf("%s\n",str[i]);
} 展开
#include<stdio.h>
#include<string.h>
int min(int a,int b)
{ if(a>b) return b;
else return a;}
void main()
{
char *str[]={"turbo c","turbo pascal","basic","dbase","lisp","fortran"};
int i,j,k=0,l,n;
char *temp;
scanf("%d",&n);
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
l=min(strlen(str[i]),strlen(str[j]));
for(;k<l;k++)
{
if(*(str[i]+k)!=*(str[j]+k))
{
if(*(str[i]+k)>*(str[j]+k))
{
temp=str[j];
str[j]=str[i];
str[i]=temp;
}
break;
}
}
}
}
for(i=0;i<n;i++)
printf("%s\n",str[i]);
} 展开
2个回答
展开全部
自己态皮做strcmp和strcpy子函数,或者把能实现相同功能的子函数模块用for循环来处理
strcmp子函数的功能是比较str1和str1字符串的每个字符
用一个for循环来实现这个功能的
功能实现,模拟着函数
void mystrcmp(char *str1,char *str2)
{
int i;
for(i=0;str1[i]||str2[i];i++)
if(str1[i]<str2[i])
retrun -1;
else if(str1[i]>str2[i])
return 1;
return 0;
}
strcpy拷贝子函数也是用一个for循环来实现的
void mystrcpy(char *str1,char *str2)
{
int i=0;
while(str1[i]=str2[i])
i++;
}
你完全可以把这个功能模块用着相应的位置
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
排序大循环没问题
for(;k<l;k++)
{
if(*(str[i]+k)!=*(str[j]+k)) //你这里只是判断了不相等的情况,大小没有判断
这一块应该是比较部分吧,感觉应该不对
应该是
for(k=0;str[i][k]||str[j][k];k++)
{
if(str[i][k]>str[j][k]) //也可以用指针,大了就交换,小了或等于不交换
交换代码
}
l=min(strlen(str[i]),strlen(str[j]));
这一句完全可以用l=strlen(str[i])>strlen(str[j])?strlen(str[i]):strlen(str[j]);
不用子函数,或者一个if--else来解决
temp=str[j];
str[j]=str[i];
str[i]=temp;
这是交换的代码,字符串不能这么交换,可以用strcpy拷贝函仿者数,或者字符一个帆大差一个的交换
不能整个字符串用=来赋值
strcmp子函数的功能是比较str1和str1字符串的每个字符
用一个for循环来实现这个功能的
功能实现,模拟着函数
void mystrcmp(char *str1,char *str2)
{
int i;
for(i=0;str1[i]||str2[i];i++)
if(str1[i]<str2[i])
retrun -1;
else if(str1[i]>str2[i])
return 1;
return 0;
}
strcpy拷贝子函数也是用一个for循环来实现的
void mystrcpy(char *str1,char *str2)
{
int i=0;
while(str1[i]=str2[i])
i++;
}
你完全可以把这个功能模块用着相应的位置
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
排序大循环没问题
for(;k<l;k++)
{
if(*(str[i]+k)!=*(str[j]+k)) //你这里只是判断了不相等的情况,大小没有判断
这一块应该是比较部分吧,感觉应该不对
应该是
for(k=0;str[i][k]||str[j][k];k++)
{
if(str[i][k]>str[j][k]) //也可以用指针,大了就交换,小了或等于不交换
交换代码
}
l=min(strlen(str[i]),strlen(str[j]));
这一句完全可以用l=strlen(str[i])>strlen(str[j])?strlen(str[i]):strlen(str[j]);
不用子函数,或者一个if--else来解决
temp=str[j];
str[j]=str[i];
str[i]=temp;
这是交换的代码,字符串不能这么交换,可以用strcpy拷贝函仿者数,或者字符一个帆大差一个的交换
不能整个字符串用=来赋值
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这样修改就没问题了,不明白可以追问!
#include<兄卜stdio.h>
#include<string.h>
int min(int a,int b)
{
if(a>b) return b;
else
return a;
}
int main()
{
char *str[]={"turbo c","turbo pascal","basic","dbase","lisp","fortran"};
int i,j,k=0,l,n;
char *temp;
scanf("%d"尺启,&n);
for(i=0;i<n;i++){
for(j=0;j<n-1-i;j++){
l=min(strlen(str[j]),strlen(str[j+1]));
printf("%d\n",l);
for(k=0;k<陵尘如l;k++){
if(*(str[j]+k)!=*(str[j+1]+k)){
if(*(str[j]+k)>*(str[j+1]+k)){
temp=str[j+1];
str[j+1]=str[j];
str[j]=temp;
}
}
}
}
}
for(i=0;i<n;i++)
printf("%s\n",str[i]);
return 0;
}
#include<兄卜stdio.h>
#include<string.h>
int min(int a,int b)
{
if(a>b) return b;
else
return a;
}
int main()
{
char *str[]={"turbo c","turbo pascal","basic","dbase","lisp","fortran"};
int i,j,k=0,l,n;
char *temp;
scanf("%d"尺启,&n);
for(i=0;i<n;i++){
for(j=0;j<n-1-i;j++){
l=min(strlen(str[j]),strlen(str[j+1]));
printf("%d\n",l);
for(k=0;k<陵尘如l;k++){
if(*(str[j]+k)!=*(str[j+1]+k)){
if(*(str[j]+k)>*(str[j+1]+k)){
temp=str[j+1];
str[j+1]=str[j];
str[j]=temp;
}
}
}
}
}
for(i=0;i<n;i++)
printf("%s\n",str[i]);
return 0;
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询