如何解决姓氏排序后与对应名字不匹配的问题
问题描述
姓氏已按字母顺序排序,但与对应的名字不匹配。我使用两个数组存储从文件中提取的名字和姓氏。
我使用以下代码对姓氏进行排序:
for(int i= 0; i < LISTSIZE; i++) { minidx = i; //declared as int before strcpy(headers[0],lastname[i]); for(int j = i; j < LISTSIZE; j++) { int match = strcmp(lastname[j],headers[0]); if (match < 0) { minidx = j; strcpy(headers[0], lastname[j]); } } strcpy(headers[0], lastname[minidx]); strcpy(lastname[minidx], lastname[i]); strcpy(lastname[i], headers[0]); }
我尝试将名字和姓氏合并到一个数组中,但未成功。我查阅了多个论坛但未找到有效方案。我是编程新手,恳请谅解我的知识不足。
解决方法
方法一:同步交换名字数组
你现在只对lastname数组做了排序交换,但没同步处理名字数组。每次交换lastname元素的时候,把对应的firstname数组元素也一起交换就行,不用合并数组。修改后的代码如下:
for(int i= 0; i < LISTSIZE; i++) { minidx = i; //declared as int before // 直接用lastname[i]作为初始比较基准,不用拷贝到headers for(int j = i; j < LISTSIZE; j++) { int match = strcmp(lastname[j], lastname[minidx]); if (match < 0) { minidx = j; } } // 交换姓氏 strcpy(headers[0], lastname[minidx]); strcpy(lastname[minidx], lastname[i]); strcpy(lastname[i], headers[0]); // 同步交换名字 char temp_name[NAME_LEN]; // 假设NAME_LEN是你定义的名字长度常量 strcpy(temp_name, firstname[minidx]); strcpy(firstname[minidx], firstname[i]); strcpy(firstname[i], temp_name); }
方法二:使用结构体存储姓名(更规范)
直接用结构体把名字和姓氏绑定在一起,排序的时候整个结构体交换,从根本上避免匹配错误:
#include <stdio.h> #include <string.h> #define LISTSIZE 10 #define NAME_LEN 50 // 定义姓名结构体 typedef struct { char firstname[NAME_LEN]; char lastname[NAME_LEN]; } Person; int main() { Person people[LISTSIZE]; // 假设这里已经从文件读取了数据到people数组 // 选择排序结构体数组 for(int i=0; i<LISTSIZE; i++){ int minidx = i; for(int j=i; j<LISTSIZE; j++){ if(strcmp(people[j].lastname, people[minidx].lastname) < 0){ minidx = j; } } // 交换整个结构体 Person temp = people[minidx]; people[minidx] = people[i]; people[i] = temp; } // 输出测试 for(int i=0; i<LISTSIZE; i++){ printf("%s %s\n", people[i].firstname, people[i].lastname); } return 0; }
这种方法更符合C语言的编程习惯,数据绑定后不会出现匹配错位的问题,后期维护也更方便。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

