如何用冒泡排序与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
相关产品推荐
相关产品推荐

