我读取了一个文本文件并将数据存储在 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
函数就可以使用它。这需要三个改变:
添加
sortarray
函数的前向声明:void sortarray(struct person *);
调用传递第一个元素指针的函数:
sortarray(student); // As arrays decays to pointers, this is like passing &student[0]
去掉
sortarray
函数中student
数组的定义。
关于c - 对结构数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58168713/