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

如何用冒泡排序与strcmp排序C语言结构体数组?代码异常求助

结构体数组冒泡排序后全输出最后输入名字?来排查这两个问题

你提到用冒泡排序结合strcmp对带字符串成员的结构体数组排序,结果循环输出全是最后输入的名字,这个问题我之前也踩过坑,大概率是输入逻辑错误或者排序时的字符串交换逻辑出错,下面给你拆解和修复方案:

先排查输入环节的致命坑

很多新手会犯这个错:如果你的输入代码是类似这样的:

char temp_input[SIZE];
struct Prova arr[N];
for (int i = 0; i < N; i++) {
    printf("输入第%d个名字:", i+1);
    scanf("%s", temp_input);
    arr[i].nome = temp_input; // ❌ 绝对错误!数组不能直接赋值指针
}

这段代码里,所有结构体的nome成员都被指向了同一个temp_input数组的地址,当你输入最后一个名字时,temp_input的内容被覆盖,所以所有结构体的nome都会显示最后输入的内容。

正确的输入方式

直接把输入内容写入结构体自己的nome数组,或者用strcpy复制:

struct Prova arr[N];
for (int i = 0; i < N; i++) {
    printf("输入第%d个名字:", i+1);
    // 方式1:直接读入到结构体的数组中(适合无空格的名字)
    scanf("%s", arr[i].nome);
    // 方式2:用fgets处理带空格的名字(记得去掉换行符)
    // fgets(arr[i].nome, SIZE, stdin);
    // arr[i].nome[strcspn(arr[i].nome, "\n")] = '\0';
}

再修复排序函数的逻辑

看你给出的排序代码片段没写完,不过冒泡排序处理结构体数组时,有两种正确的交换方式:

方式1:交换整个结构体(简单直观)

因为你的结构体只有一个字符串成员,直接交换整个结构体实例更省事:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 16
#define N 5
struct Prova { char nome[SIZE]; };

void sort(struct Prova *ptr) {
    struct Prova temp; // 定义结构体临时变量
    // 冒泡排序外层循环:只需要循环N-1次,最后一个元素自然有序
    for (int i = 0; i < N - 1; i++) {
        // 内层循环:每次遍历到未排序的最后一个元素前
        for (int j = 0; j < N - 1 - i; j++) {
            // 比较两个结构体的nome字符串,按字典序升序排序
            if (strcmp(ptr[j].nome, ptr[j+1].nome) > 0) {
                // 交换两个结构体
                temp = ptr[j];
                ptr[j] = ptr[j+1];
                ptr[j+1] = temp;
            }
        }
    }
}

方式2:只交换字符串内容(适合结构体成员较多的情况)

如果结构体有很多成员,不想交换整个结构体,可以单独交换nome的内容:

void sort(struct Prova *ptr) {
    char temp[SIZE]; // 字符串临时缓冲区
    for (int i = 0; i < N - 1; i++) {
        for (int j = 0; j < N - 1 - i; j++) {
            if (strcmp(ptr[j].nome, ptr[j+1].nome) > 0) {
                // 用strcpy交换两个字符串
                strcpy(temp, ptr[j].nome);
                strcpy(ptr[j].nome, ptr[j+1].nome);
                strcpy(ptr[j+1].nome, temp);
            }
        }
    }
}

测试完整代码

把输入、排序、输出整合起来,测试一下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 16
#define N 5
struct Prova { char nome[SIZE]; };

void sort(struct Prova *ptr) {
    struct Prova temp;
    for (int i = 0; i < N - 1; i++) {
        for (int j = 0; j < N - 1 - i; j++) {
            if (strcmp(ptr[j].nome, ptr[j+1].nome) > 0) {
                temp = ptr[j];
                ptr[j] = ptr[j+1];
                ptr[j+1] = temp;
            }
        }
    }
}

int main() {
    struct Prova arr[N];
    // 输入名字
    for (int i = 0; i < N; i++) {
        printf("输入第%d个名字:", i+1);
        scanf("%s", arr[i].nome);
    }
    // 排序
    sort(arr);
    // 输出排序结果
    printf("\n排序后的名字:\n");
    for (int i = 0; i < N; i++) {
        printf("%s\n", arr[i].nome);
    }
    return 0;
}

这段代码运行后,就能正确按字典序排序结构体数组,不会再出现全是最后输入名字的情况了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:06:52