2010-09-16 3 views
0

Existe-t-il un moyen de trier un tableau de chaînes dans l'ordre alphabétique où les chaînes contiennent à la fois des majuscules et des minuscules? Comme les lettres majuscules ont une valeur ASCII inférieure, des fonctions telles que strcmp indiqueront toujours qu'il s'agit d'une lettre minuscule. Par exemple, disons que nous voulions trier "ABCD", "ZZZZ", "tortue", "JAVA", "eau".Tri d'un tableau de chaînes avec majuscules et minuscules dans C

Lorsque vous utilisez des fonctions comme strcmp pour trier ces chaînes, il devient:

ABCD JAVA ZZZZ tortue eau

quand il devrait être:

ABCD JAVA tortue eau ZZZZ

Répondre

3

Utilisez qsort avec strcasecmp ou strcoll comme fonction de comparaison. Strcasecmp est susceptible d'être plus rapide, mais strcoll est plus flexible et utilise les paramètres régionaux des programmes pour que les chaînes non-ASCII fonctionnent.

+0

strcasecmp n'est pas C89/C99 -> n'est pas ANSI C – user411313

2

Essayez strcoll(3).

+0

Comment puis-je l'utiliser? D'après ce que je comprends, il appelle strcmp sauf s'il y a un ensemble de paramètres régionaux ... mais je ne sais pas ce qu'est une locale. – DemonicImpact

+0

strcoll fonctionne comme la casse comme strcmp, pas une solution pour votre question – user411313

+0

@ user411313, cela dépend de la locale que vous avez définie. –

1

une solution simple propre à strictement C89 devrait aider:

#include <ctype.h> 
#include <string.h> 

int strcmpIgnoreCase(const char *a,const char *b) 
{ 
    while(*a && *b) 
    { 
    register r=tolower(*a)-tolower(*b); 
    if(r) 
     return r; 
    ++a; 
    ++b; 
    } 
    return tolower(*a)-tolower(*b); 
} 
+1

tolower ** nécessite ** un 'char non signé '. Pour être portable, votre code devrait lancer l'argument: 'tolower ((unsigned char) * a)'. * Oh ... et spécifiez 'int' pour' register r': de cette façon, votre code est également 'compatible C99'. * – pmg

Questions connexes