C中字符串/结构的排序数组

C中字符串/结构的排序数组,c,arrays,pointers,struct,C,Arrays,Pointers,Struct,我是C语言的新手,我需要创建一个函数来对struct Student数据类型数组进行排序(按字母顺序排列在元素Student.ime之后)。我不确定应该把指针放在哪里,这样才能返回新数组 #include <stdio.h> #include <stdlib.h> #include <string.h> struct Student { int id; char ime[20]; char prezime[20]; char

我是C语言的新手,我需要创建一个函数来对struct Student数据类型数组进行排序(按字母顺序排列在元素
Student.ime
之后)。我不确定应该把指针放在哪里,这样才能返回新数组

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Student {
    int id;
    char ime[20];
    char prezime[20];
    char brindexa[20];
    struct Datum datum_rodjenja;
};

struct Student sortiraj(struct Student niz[], int vel)
{
    int i, j;
    struct Student tempo;
    tempo = niz[0];
    for(j=0 ; j<vel ; j++)
    {
        for(i=j ; i<vel ; i++)
        {
            if(strcmp(tempo.ime,niz[i].ime)>0)
            {
                tempo = niz[i];
            }
            i++;
        }
        niz[j] = tempo;
        j++;
    }
    return niz;
}

有人能给我一些提示吗。谢谢。

首先,您的函数签名没有标记为返回类型作为
学生数组。其次,我不知道您尝试使用哪种排序算法,但您的实现不正确

如果您更正了函数签名,则在调用时不应出现任何错误:

struct Student* sortiraj(struct Student niz[], int vel)
有关
sortiraj
的提示:检查排序算法的
selection sort
bubble sort
。为了进一步研究,您可以检查一些递归算法,如
合并排序
快速排序
,它们更先进,您需要更多的编程知识来实现它们

  • 将函数
    sortiraj
    的返回类型更改为
    void

  • 在函数
    main
    中创建并填充
    struct Student niz[]
    数组

  • 从函数
    main
    ,将数组及其长度(
    vel
    )传递给函数
    sortiraj

  • 当然,不需要从函数
    sortiraj
    返回任何内容(如第1节所示)


  • 由于您正在传入一个指针,即
    niz
    ,因此您正在更改
    niz
    指向的内存。这意味着您不必返回
    niz


    但是,如果要返回
    niz
    ,函数的返回类型必须与
    niz
    相同。当前,您的返回类型为just
    struct Student
    ,因此您应该会得到一个编译错误。

    您似乎正在对数组进行排序,因此根本不需要返回它。另外,使用标准库函数
    qsort()


    另外,请使用英文函数和变量名。

    您是否考虑过使用
    qsort()
    函数?例如:

    如果有字符串数组say strings(注意:不是结构数组),字符串数为say,cnt,则:

    函数sortstring定义为:

    static int sortstring( const void *str1, const void *str2 )
    {
        const char *rec1 = *(const char**)str1;
        const char *rec2 = *(const char**)str2;
        int val = strcmp(rec1, rec2);
    
        return val;
    }
    
    //for a simple test, run this main with the code above:  
    
    int main(void)  
    {  
        char *strings[]={"this", "is", "a", "test", "of", "the", "qsort", "function", "to", "try"};
        int strlen = sizeof(strings)/sizeof(char *);
    
        qsort(strings, strlen, sizeof(char *), sortstring);
    
        return 0;
    }  
    
    //Note my environment required #include <ansi_c.h>
    
    static int-sortstring(const-void*str1,const-void*str2)
    {
    常量字符*rec1=*(常量字符**)str1;
    常量字符*rec2=*(常量字符**)str2;
    int val=strcmp(rec1,rec2);
    返回val;
    }
    //对于简单测试,请使用上面的代码运行此main:
    内部主(空)
    {  
    char*strings[]={“this”、“is”、“a”、“test”、“of”、“the”、“qsort”、“function”、“to”、“try”};
    int strlen=sizeof(strings)/sizeof(char*);
    qsort(字符串、strlen、sizeof(char*)、sortstring);
    返回0;
    }  
    //注意我的环境要求#包括
    
    一个能够缩进代码的新手-这是刷新,得到+1
    sortiraj
    不正确。为什么不使用
    qsort
    ?您考虑过qsort吗?谢谢您的帮助。从现在起我将使用英语,我只是注册,所以我忘记了。我将尝试在我的代码中实现这一点。@H2CO3-您的答案更准确地回答了这个问题(结构数组排序)。不知道为什么我会打勾。像往常一样干得不错+1.
    int cmp(const void *ap, const void *bp)
    {
        const struct Student *a = ap, *b = bp;
        return strcmp(a->ime, b->ime);
    }
    
    struct Student students[] = { /* whatever */ };
    qsort(
        students,
        sizeof(students) / sizeof(studends[0]),
        sizeof(students[0]),
        cmp
    );
    
    qsort(strings, cnt, sizeof(char*), sortstring);  
    
    static int sortstring( const void *str1, const void *str2 )
    {
        const char *rec1 = *(const char**)str1;
        const char *rec2 = *(const char**)str2;
        int val = strcmp(rec1, rec2);
    
        return val;
    }
    
    //for a simple test, run this main with the code above:  
    
    int main(void)  
    {  
        char *strings[]={"this", "is", "a", "test", "of", "the", "qsort", "function", "to", "try"};
        int strlen = sizeof(strings)/sizeof(char *);
    
        qsort(strings, strlen, sizeof(char *), sortstring);
    
        return 0;
    }  
    
    //Note my environment required #include <ansi_c.h>