Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用指针按字母顺序对字符串数组进行排序_C_Sorting_Pointers_String Comparison - Fatal编程技术网

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;
    }
}