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

如何对结构体中的char数组进行排序(禁用std::string)

问题分析与修复方案

原代码存在的核心问题

  • 语法错误:结构体定义末尾、数组定义末尾缺少分号,导致编译失败。
  • 排序逻辑片面:仅比较字符串首字符,无法实现完整的字典序排序(比如"Bob"和"Alice"首字符'B' > 'A'能正确判断,但"Anna"和"Andrew"首字符相同就会失效)。
  • 数组赋值错误:C语言中char数组不能直接用=赋值,这是非法操作。
  • 交换逻辑错误:直接用data[x]的内容覆盖data[i],丢失了data[i]的原始数据,没有完成真正的交换。

修正后的完整代码

#include <stdio.h>
#include <string.h>

struct employee
{
    long Id;
    char name[20]; // 补充分号
};

int main()
{
    // 初始化示例数据,方便验证排序结果
    employee data[5] = {
        {101, "Carlos"},
        {102, "Brayan"},
        {103, "Alice"},
        {104, "David"},
        {105, "Eve"}
    };

    // 冒泡排序实现按姓名字典序排序
    for(int i = 0; i < 5; i++)
    {
        for(int x = i + 1; x < 5; x++)
        {
            // 用strcmp比较完整字符串:返回>0表示data[i].name字典序更大
            if(strcmp(data[i].name, data[x].name) > 0)
            {
                // 用临时结构体变量完成交换,避免单独处理数组赋值
                employee temp = data[i];
                data[i] = data[x];
                data[x] = temp;
            }
        }
    }

    // 打印排序结果
    for(int i = 0; i < 5; i++)
    {
        printf("Id: %ld, Name: %s\n", data[i].Id, data[i].name);
    }

    return 0;
}

关键修复说明

  1. 字符串比较:使用C标准库的strcmp函数(需包含<string.h>),可以完整对比两个char数组的字典序,替代原有的首字符比较逻辑。如果需要忽略大小写排序,POSIX环境可用strcasecmp,Windows环境可用_stricmp。
  2. 结构体交换:直接交换整个employee实例,避免了单独处理char数组的赋值麻烦——C语言允许结构体直接赋值,比手动用strcpy复制name数组更简洁可靠。
  3. 语法修正:补全了所有缺失的分号,确保代码能正常编译。

内容的提问来源于stack exchange,提问作者OLearning

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 08:45:36