Voici mon code:Comment trier correctement les chaînes en C?
#include <stdio.h>
#include <string.h>
#include <errno.h>
int cmp(const void *a, const void *b) {
const char **ia = (const char **)a;
const char **ib = (const char **)b;
return strcmp(*ia, *ib);
}
void print_array(char **array, size_t len) {
size_t i;
for(i=0; i<len; i++) {
printf("%s, ", array[i]);
}
putchar('\n');
}
int main(int argc, char *argv[]) {
char *strings[] = { "z1.doc", "z100.doc", "z2.doc", "z3.doc", "z20.doc"};
size_t strings_len = sizeof(strings)/sizeof(char *);
print_array(strings, strings_len);
qsort(strings, strings_len, sizeof(char *), cmp);
print_array(strings, strings_len);
system("PAUSE");
return 1;
}
la sortie réelle est
z1.doc, z100.doc, z2.doc, z20.doc, z3.doc
et je veux que ce soit
z1.doc, z2.doc, z3.doc, z20.doc, z100.doc
Qu'est-ce que je fais mal?
Yikes! Tellement d'étoiles! 'const char * ia = a;'/* ... */'retourne strcmp (ia, ib);' – pmg
Entré à ceci à http://www.mail-archive.com/[email protected] /msg23829.html: Explorer utilise la fonction StrCmpLogicalW() dans shlwapi.dll pour trier les noms de fichiers dans l'ordre "logique". L'ordre de tri exact n'est pas garanti et peut changer avec chaque version de Windows ou service pack! –
@pmg: C'est incorrect. Le faire comme vous le suggérez entraînera sûrement un défaut de segmentation. La variante alternative serait 'const char * ia = * (const char **) a; ...; retourner strcmp (ia, ib); ', mais absolument pas ce que vous suggérez. – AnT