Übe, API zu lernen. Wenn Sie ein Array sortieren, das auch leere Elemente in aufsteigender Reihenfolge enthält, Der Rohling kommt zum Anfang.
Wenn Sie nicht möchten, dass Leerzeichen verglichen werden Sortieren Sie, indem Sie die Länge des Arrays angeben.
qsort(table, 4, sizeof(table[0]), compare_char);
Teil 4 von ist anwendbar.
qsort.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int compare_char(const void* left, const void* right) {
char *left_char = (char *)left;
char *right_char = (char *)right;
return strcmp( left_char, right_char );
}
int main() {
int i=0;
char table[10][20] = {
"123",
"A0",
"Z0",
"9w3"
};
for(i=0; i<10; i++) {
printf("%d %s\n", i, table[i]);
}
printf(" --- sort\n");
qsort(table, 4, sizeof(table[0]), compare_char);
for(i=0; i<10; i++) {
printf("%d %s\n", i, table[i]);
}
}
In Reaktion auf den hervorgehobenen Kommentar wurde er so geändert, dass die Vergleichsfunktion des aufgerufenen Ziels die Typinformationen des Objekts genau empfängt. Außerdem wurde der Code so geändert, dass das Ende des Arrays mit "NULL" definiert und das Ende des Zeichenarrays erkannt werden kann.
qsort-withPointer.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int compare_char(const void* left, const void* right) {
const char *left_char = *(const char **)left;
const char *right_char = *(const char **)right;
return strcmp( left_char, right_char );
}
int main() {
int i=0;
//Entspricht dem Platzieren eines Zeichenfolgenliteral in einem Array
const char* s0 = "123";
const char* s1 = "A0";
const char* s2 = "Z0";
const char* s3 = "9w3";
//Wache am Ende des Arrays(NULL)Platz
const char* table[] = {s0, s1, s2, s3, NULL};
printf(" --- original\n");
// table[]Zähle die Elemente von
//Inkrementieren Sie den Zähler, bis er einen NULL-Wert findet, der das Ende des Arrays darstellt
i=0;
while(table[i]) {
printf("%d %s\n", i, table[i]);
i++;
}
printf(" --- sort\n");
qsort(table, i, sizeof(*table), compare_char);
i=0;
while(table[i]) {
printf("%d %s\n", i, table[i]);
i++;
}
}
Recommended Posts