我有一个程序接受用户输入并创建包含用户输入的多个字段的记录。要求用户输入人员的名字和姓氏、地址、城市、州、邮政编码和电话号码。我正在尝试根据每条记录的城市按字母顺序对记录进行排序。我该怎么做,我很困惑如何根据一个变量进行排序,然后正确打印整个记录。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
typedef struct Record Record;
struct Record
{
char fname[51];
char lname[51];
char address[51];
char city[51];
char state[51];
char zipcode[51];
char phoneNumber[51];
Record *next;
};
int main()
{
FILE *fileWriter;
const char filename[] = "data.txt";
char answer = '\0';
Record *records = NULL;
Record *records_first = NULL;
Record *records_previous = NULL;
fileWriter = fopen(filename,"wt");
if(fileWriter != NULL) {
for( ; ; ) {
records = (Record*) malloc(sizeof(Record));
if(records_first == NULL)
records_first = records;
if(records_previous != NULL)
records_previous->next = records;
records = records_first;
printf("First Name: \n");
scanf("%s", records->fname);
fprintf(fileWriter,"%s\t",records->fname);
printf("Last Name: \n");
scanf("%s", records->lname);
fprintf(fileWriter,"%s\t",records->lname);
printf("Address: \n");
scanf(" %[^\n]", records->address);
fprintf(fileWriter,"%s\t",records->address);
printf("City: \n");
scanf("%s", records->city);
fprintf(fileWriter,"%s\t",records->city);
printf("State: \n");
scanf("%s", records->state);
fprintf(fileWriter,"%s\t",records->state);
printf("Zipcode: \n");
scanf("%s", records->zipcode);
fprintf(fileWriter,"%s\t",records->zipcode);
printf("Phone Number: \n");
scanf("%s", records->phoneNumber);
fprintf(fileWriter,"%s\t\n",records->phoneNumber);
records->next = NULL;
records_previous = records;
printf("Are there anymore records? [y/n] ");
scanf(" %c", &answer);
if(tolower(answer) != 'y') {
free(records);
fclose(fileWriter);
break;
}
}
} else
printf("Error opening file.");
return 0;
}
**Edited Version**
我尝试使用 qsort()。但最终出现了 fatal error 。最重要的是,当我只能对一个字段进行排序时,如何正确打印整条记录?
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <ctype.h>
struct Record
{
char fname[51];
char lname[51];
char address[51];
char city[51];
char state[51];
int zipcode;
int phoneNumber;
};
int compare_city(const void *const p1, const void *const p2)
{
struct Record *r1 = (struct Record *) p1;
struct Record *r2 = (struct Record *) p1;
return strcmp(r1->city, r2->city);
}
int main()
{
FILE *fileWriter;
const char filename[] = "data.txt";
char answer = 'y';
int size = 1;
int i = 0;
int count = 1;
struct Record *records = NULL;
struct Record *records_temp = NULL;
fileWriter = fopen(filename,"wb");
if(fileWriter != NULL)
while(answer == 'y' || answer == 'Y')
{
if(records_temp == NULL)
{
struct Record *records_temp = realloc(records,(size)*sizeof(*records));
}
records = records_temp;
printf("First Name: \n");
scanf("%s", records[i].fname);
printf("Last Name: \n");
scanf("%s", records[i].lname);
printf("Address: \n");
scanf(" %[^\n]", records[i].address);
printf("City: \n");
scanf("%s", records[i].city);
printf("State: \n");
scanf("%s", records[i].state);
printf("Zipcode: \n");
scanf("%s", records[i].zipcode);
printf("Phone Number: \n");
scanf("%s", records[i].phoneNumber);
//stores all record info
printf("Are there anymore records? [y/n] ");
scanf(" %c", &answer);
if(tolower(answer) == 'y')
{
i++;
count++;
}
for(i = 0; i < count ; i++)
{
qsort(records, count, sizeof(struct Record), compare_city);
fprintf(fileWriter,"%s\n",records[i].fname);
fprintf(fileWriter,"%s\n",records[i].lname);
fprintf(fileWriter,"%s\n",records[i].address);
fprintf(fileWriter,"%s\n",records[i].city);
fprintf(fileWriter,"%s\n",records[i].state);
fprintf(fileWriter,"%d\n",records[i].zipcode);
fprintf(fileWriter,"%d\n",records[i].phoneNumber);
}
free(records);
}
return 0;
}
最佳答案
照原样,你有一个列表结构,不能用 qsort()
排序, 但您可以改用数组,并使用 malloc()
动态分配它+ realloc()
.
要对条目进行排序,您可以使用 qsort()
,例如假设你想按名字排序,然后
int compare_first_name(const void *const p1, const void *const p2)
{
struct Record *r1 = (struct Record *) p1;
struct Record *r2 = (struct Record *) p1;
return strcmp(r1->fname, r2->fname);
}
然后
qsort(base, count, sizeof(struct Record), compare_first_name);
关于c - 如何排序文件输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30552873/