有必要对字段(char last_name [256];)结构Pers进行排序 并在控制台中显示用户。 怎么做? 提前谢谢。
有这样的结构(嵌套):
struct Pers {
int id;
char first_name[256];
char last_name[256];
struct {
int age;
int status;
} st;
} Pers;
struct Pers sw[2];
char i=0;
从文件和输出中读取如下所示: 所有内容都按照从文件中读取的顺序显示
FILE *file;
file = fopen("1.txt", "r");
while ( fscanf(file, "%d%s%s%d%d", &sw[i].id,sw[i].first_name,sw[i].last_name,&sw[i].st.age,&sw[i].st.status) != EOF)
{
printf("%d %s %s %d %d\n", sw[i].id, sw[i].first_name, sw[i].last_name, sw[i].st.age, sw[i].st.status);
i++;
}
fclose(file);
答案 0 :(得分:1)
要使用qsort
中的stdlib
来排序结构,您应该实现比较两个元素的函数。并使用来自strcmp
的{{1}}字符串进行比较。
详细信息位于references。
将string
和first_name
用于排序的情况示例(last_name
是第一个用于比较的情况):
last_name
用法:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int compare (const void * a, const void * b)
{
const struct Pers * first = (const struct Pers *) a;
const struct Pers * second = (const struct Pers *) b;
// compare last names and check result. can be also:
// if( !strcmp(first->last_name, second->last_name) )
if( 0 == strcmp(first->last_name, second->last_name) )
// compare first names if last names are equal
return strcmp(first->first_name, second->first_name);
else
return strcmp(first->last_name, second->last_name);
}
我的数据结果:
printf("Before sorting:\n");
for(i = 0; i < 2; i++)
{
printf("%d %s %s %d %d\n",sw[i].id,sw[i].first_name,sw[i].last_name,sw[i].st.age,sw[i].st.status);
}
qsort (sw, 2, sizeof(struct Pers), compare);
printf("After sorting:\n");
for(i = 0; i < 2; i++)
{
printf("%d %s %s %d %d\n",sw[i].id,sw[i].first_name,sw[i].last_name,sw[i].st.age,sw[i].st.status);
}