You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决姓氏排序后与对应名字不匹配的问题

问题描述

姓氏已按字母顺序排序,但与对应的名字不匹配。我使用两个数组存储从文件中提取的名字和姓氏。

我使用以下代码对姓氏进行排序:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 16:25:27