我需要对一个结构体数组进行排序,每个结构体中都有一个字符串作为名称。我想使用冒泡排序和strcmp函数进行简单的排序,但我的代码无法正常工作,它会输出整个循环中最后输入的那个名称。
#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) {
char temp[SIZE];
for (int i = 0; i < N; i++) {
for (int j = i + 1; j < N; j++) {
if (strcmp((ptr + i)->nome, (ptr + j)->nome) < 0) {
strcpy(temp, (ptr + i)->nome);
strcpy((ptr + i)->nome, (ptr + j)->nome);
strcpy(temp, (ptr + j)->nome);
}
}
}
}
int main() {
struct Prova * ptr;
ptr = (struct Prova*) malloc(N * sizeof(struct Prova));
for (int i = 0; i < N; i++) {
scanf(" %s", (ptr + i)->nome);
}
sort(ptr);
for (int i = 0; i < N; i++) {
printf("%s\n", (ptr + i)->nome);
}
}
基本上,它需要对结构体中的所有名称进行排序,并按名称的第一个字母升序打印它们。
更新:后来我注意到了代码中的错误,感谢大家的回复/建议。现在是这样的:
for(int i = 0; i < N - 1; i++)
{
for(int j = i+1; j < N; j++)
{
// < 0 = Z-A invece > 0 = A-Z
if(strcmp((ptr+i)->nome,(ptr+j)->nome) > 0)
{
strcpy(temp, (ptr+i)->nome);
strcpy((ptr+i)->nome,(ptr+j)->nome);
strcpy((ptr+j)->nome, temp);
}
}
}
qsort
函数。 - Karsten Koopif(strcmp(ptr[j].nome,ptr[j+1].nome) < 0)
并循环到j < N-1
。还要注意用于索引数组的简化符号。 - Paul Ogilvie