c - 对结构数组进行排序

标签 c sorting

我读取了一个文本文件并将数据存储在 struct 数组中,然后尝试对其进行排序并打印未排序和已排序的数组。它可以读取数组文本并存储在数组中,但是排序函数不会在没有给出任何错误的情况下运行。有什么问题吗?我使用strcmp()函数来比较student[s]:

#include <stdio.h>

struct person { //struct person with 4 fields
    char name[100];
    char address[100];
    char IDnumber[20];
    int  age;
};

int main (void) {
    FILE *file = fopen ( "personout.txt", "r");
    struct person student[10]; // declares an struct array to store data
    int k = 0;
    if (file != NULL) {
        char line[300];
        while ( k < 10 && fgets ( line, sizeof line, file ) != NULL ) {
            if ( 4 == sscanf ( line, " %99[^,], %99[^,], %19[^,], %d", 
                student[k].name, student[k].address, student[k].IDnumber, &student[k].age))
            {
                printf ( "%s\n Un-sorted array");
                printf ( "%s\n", student[k].name);
                printf ( "%s\n", student[k].address);
                printf ( "%s\n", student[k].IDnumber);
                printf ( "%d\n", student[k].age);
                k++;
            }
        }
        fclose ( file );
    }
    sortarray();

    // prints sorted array
    printf ( "%s\n Sorted array");
    for (int t=0;t<10;t++) {
        printf ( "%s\n", student[t].name);
        printf ( "%s\n", student[t].address);
        printf ( "%s\n", student[t].IDnumber);
        printf ( "%d\n", student[t].age);
        t++;
    }
}

void sortarray(){
    // number of records a  r=a first for loop
    // inner for loop s=r+1
    struct person temp,student[10];
    int a=10;
    for (int r=0;r<a-1;r++) {
        for (int s=r+1;r<a;s++) {
            if (strcmp(student[r].name, student[s].name) > 0) {
                temp = student[r];
                student[r] =student[s];
                student[s] = temp;
            }
        }
    }
}

最佳答案

除了您的两个 printf 调用的未定义行为之外,您还遇到了局部变量实际上是局部变量的问题。

main 函数中的student 数组与sortarray 函数中的student 数组不同。 sortarray 函数中的数组将未初始化,尝试对其进行排序将导致未定义的行为

解决方案是从main 函数传递一个指向数组第一个元素的指针,这样sortarray 函数就可以使用它。这需要三个改变:

  1. 添加 sortarray 函数的前向声明:

    void sortarray(struct person *);
    
  2. 调用传递第一个元素指针的函数:

    sortarray(student);  // As arrays decays to pointers, this is like passing &student[0]
    
  3. 去掉sortarray函数中student数组的定义。

关于c - 对结构数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58168713/

相关文章:

c - mmap 在 Intel (i7) 和 Arm 上的不同行为?

c - 使用 C Readline 从文件而不是标准输入中读取一行

c - 如何在不干扰数组且不使用临时数组或变量进行交换的情况下按升序或降序打印数组?

c - 不使用多个数组的 C 快速排序实现

mysql - SQL使用带有字母数字数据的数字排序对列(varchar(255))进行排序

c++ - OpenCL 结构体值在 CPU 上正确,但在 GPU 上不正确

c - 将字符串拆分为 block 。

c - 如何在 if-else 语句中使用多个 execvp 调用?

linux - 遇到 $(dollar sign) 时奇怪的 Linux 排序结果

javascript - 在javascript中对多维数组进行排序?