C 使用指针按字母顺序对字符串数组进行排序
我有一个项目,我必须创建一个程序,允许用户以任何顺序输入名称。然后程序按字母顺序显示名称。所有这些都必须使用指针来完成。现在,我尝试在程序中提示用户输入名称并显示它们,但由于某种原因,我无法让它对它们进行排序。有人能帮我吗 以下是我对该计划的尝试:C 使用指针按字母顺序对字符串数组进行排序,c,sorting,pointers,string-comparison,C,Sorting,Pointers,String Comparison,我有一个项目,我必须创建一个程序,允许用户以任何顺序输入名称。然后程序按字母顺序显示名称。所有这些都必须使用指针来完成。现在,我尝试在程序中提示用户输入名称并显示它们,但由于某种原因,我无法让它对它们进行排序。有人能帮我吗 以下是我对该计划的尝试: #包括 #包括 #包括 int main(){ int列表; 字符*名称[20]; char-str[20]; printf(“输入名称的数量:”); scanf(“%d”,列表(&L); fflush(stdin); 对于(int i=0;i*st
#包括
#包括
#包括
int main(){
int列表;
字符*名称[20];
char-str[20];
printf(“输入名称的数量:”);
scanf(“%d”,列表(&L);
fflush(stdin);
对于(int i=0;i0){
char*t=名称[i];
名称[i]=名称[i+1];
名称[i+1]=t;
}
}
}
}
int compareStr(char*str1,char*str2){
而(*str1==*str2){
如果(*str1=='\0'| |*str2=='\0')
打破
str1++;
str2++;
}
如果(*str1=='\0'&&&*str2=='\0')
返回0;
其他的
返回-1;
}
只关注排序问题,最主要的问题是,您永远不会调用稍后定义的排序函数。线路
void sortNames();
仅用于声明标识符为sortNames
的函数,该函数接受任何类型的任意数量的参数(可能不是您想要做的)。我建议将这一行改为
sortNames(名称、列表);//Not&list,因为我建议不要将其作为指针
然后对于sortNames
函数本身,我不完全清楚为什么要将要排序的数组的长度作为指针,而不是只传递int
本身。我建议将此函数修改为
void sortNames(字符**名称,int n){
int i,j;
对于(j=0;j0){
char*t=名称[i];
名称[i]=名称[i+1];
名称[i+1]=t;
}
}
}
}
尽管如此,它的一个问题是表达式compareStr(name[i],name[i+1])>0
始终为false。这是因为compareStr
只返回0或-1。您可以通过重新写入compareStr
来解决此问题,以正确处理*str1>*str2
的情况。一种可能的方法是
int compareStr(char*str1,char*str2){
如果(*str1=='\0'&&&*str2=='\0'){
返回0;
}否则如果(*str1>*str2){
返回1;
}否则如果(*str1<*str2){
返回-1;
}
返回compareStr(str1+1,str2+1);
}
虽然如果你写这篇文章是为了学习,我建议你尝试修改你当前的迭代解决方案,而不是仅仅复制和粘贴这个版本
最后,因为您希望在定义这些函数之前使用它们,所以您应该在使用它们之前移动它们的定义(即,先使用compareStr
,然后使用sortNames
,然后再使用main
),或者在文件开头为这些函数提供一个转发声明,即添加
void sortNames(字符**名称,int n);
int compareStr(char*str1,char*str2);
在您的main
上方
正如其他人所指出的,您可能希望避免
fflush(stdin)
作为其未定义的行为,我建议您不要这样做。只关注排序问题,主要的一点是您永远不会调用稍后定义的排序函数。线路
void sortNames();
仅用于声明标识符为sortNames
的函数,该函数接受任何类型的任意数量的参数(可能不是您想要做的)。我建议将这一行改为
sortNames(名称、列表);//Not&list,因为我建议不要将其作为指针
然后对于sortNames
函数本身,我不完全清楚为什么要将要排序的数组的长度作为指针,而不是只传递int
本身。我建议将此函数修改为
void sortNames(字符**名称,int n){
int i,j;
对于(j=0;j0){
char*t=名称[i];
名称[i]=名称[i+1];
名称[i+1]=t;
}
}
}
}
尽管如此,它的一个问题是表达式compareStr(name[i],name[i+1])>0
始终为false。这是因为compareStr
只返回0或-1。您可以通过重新写入compareStr
来解决此问题,以正确处理*str1>*str2
的情况。一种可能的方法是
int compareStr(char*str1,char*str2){
如果(*str1=='\0'&&&*str2=='\0'){
返回0;
}否则如果(*str1>*str2){
返回1;
}否则如果(*str1<*str2){
返回-1;
}
返回compareStr(str1+1,str2+1);
}
虽然如果你写这篇文章是为了学习,我建议你尝试修改你当前的迭代解决方案,而不是仅仅复制和粘贴这个版本
最后,因为您希望在定义这些函数之前使用它们,所以您应该在使用它们之前移动它们的定义(即,使用compareStr
,然后使用sortNames
,然后使用main
),或者提供
int compareStr(char *str1, char *str2) {
while (*str1 == *str2) {
if (*str1 == '\0' || *str2 == '\0')
break;
str1++;
str2++;
}
if (*str1 == '\0' && *str2 == '\0'){
return 0;
}
else if(*str1 > *str2){
return 1;
}else{
return -1;
}
}