【问题标题】:Cant sort array of struct无法对结构数组进行排序
【发布时间】:2016-10-06 05:48:15
【问题描述】:

我有一个结构数组,我从文本文件中读取。我写了一个排序函数,它必须按名称字段按字母顺序(A-Z)对这个数组进行排序,但它不起作用,我不知道是什么要做,plz,你能告诉我我的错误吗(代码编译,但它没有排序任何东西)。

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

int my_compare(const void*,const void*);
typedef struct {
    char name[100];
    char surname[100];
    char sname[100];
    char posada[100];
    char buff[100];
    int staz;
    char buff2[100];
    int oklad;
} test;
        ;
int main()
{
    test mass[7];
    /*struct test{
        char name[100];
        char surname[100];
        char sname[100];
        char posada[100];
        char buff[100];
        int staz;
        char buff2[100];
        int oklad;
    }mass[8];
    */
    FILE *fo;
    if((fo=fopen("C:\\Users\\andyb\\Desktop\\test2.txt","r"))==NULL)
        printf("error");
    for(int i=0;i<7;i++)
    {
        fgets(mass[i].name,50,fo);
        fgets(mass[i].surname,50,fo);
        fgets(mass[i].sname,50,fo);
        fgets(mass[i].posada,50,fo);
        fgets(mass[i].buff,50,fo);
        mass[i].staz=atoi(mass[i].buff);
        fgets(mass[i].buff2,50,fo);
        mass[i].oklad=atoi(mass[i].buff2);
    }
    fclose(fo);
    for(int i=0;i<7;i++)
    {
        printf("%s%s%s%s%d\n%d\n",mass[i].name,mass[i].surname,mass[i].sname,mass[i].posada,mass[i].staz,mass[i].oklad);
    }
    qsort( mass, sizeof(mass)/sizeof(mass[0]), sizeof(mass[0]), my_compare );
    for(int i=0;i<7;i++)
    {
        printf("%s%s%s%s%d\n%d\n",mass[i].name,mass[i].surname,mass[i].sname,mass[i].posada,mass[i].staz,mass[i].oklad);
    }

    return 0;
}

int my_compare(const void *a,const void *b)
{
    const test *pa = (const test *)a;
    const test *pb = (const test *)b;

    return strcmp( pa->name, pb->name );
}

【问题讨论】:

  • “它不起作用” → 它有什么作用?
  • 它不排序 -> 它根本不做某事?文本文件是如何格式化的?
  • 没有初始化mass[0]有什么特别的原因吗?
  • 因为您没有初始化 mass[0],但您肯定是在尝试使用它进行排序。 :)
  • 您的最后一个循环仍然迭代超出范围。你介意给我们看看你的输入文件的样本吗?

标签: c arrays sorting struct


【解决方案1】:

您的 for 循环看起来不正确:

而不是这个:

for(int i=1;i<8;i++)

你应该这样说:

for(int i=0;i<8;i++)

否则,mass[0] 将包含垃圾数据,并且当您尝试对其进行排序时会发生各种未定义的行为。

【讨论】:

  • ive already fixed that,check my question,still doesnt 工作 :(
  • 然后把你的输入文件(test2.txt)也贴出来,我会深入研究一下。
  • 另外,您更正的问题中仍然存在 for-loop 错误。
  • 它在哪里?我使用 for(int i=0;i
  • @kaylum 如果这是真的,我将无法从文件中读取我的数组,但它会读取并正确打印所有内容,但仍然无法排序
【解决方案2】:
    for (i = 1; i < n; i++)
          for (j = 0; j < n - i; j++) 
          {
             if (strcmp(mass[j].name, mass[j + 1].name) > 0) 
             {
                temp = mass[j];
                mass[j] = mass[j + 1];
                mass[j + 1] = temp;
             }
          }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-21
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    相关资源
    最近更新 更多