11
votes

Comment obtenir la position de caractère dans l'alphabet en langage C?

Y a-t-il un moyen rapide de récupérer la position du personnage donné dans l'alphabet anglais dans C?

Quelque chose comme: xxx


0 commentaires

3 Réponses :


37
votes
int position = 'g' - 'a' + 1;
In C, char values are convertible to int values and take on their ASCII values. In this case, 'a' is the same as 97 and 'g' is 103. Since the alphabet is contiguous within the ASCII character set, subtracting 'a' from your value gives its relative position. Add 1 if you consider 'a' to be the first (instead of zeroth) position.

4 commentaires

Notez que ASCII ne fait pas partie de la norme C. C'est juste assez omniprésent pour que cela fonctionne sur n'importe quel système que vous puissiez trouver pratiquement. La norme garantit que les chiffres sont contigus dans le jeu de caractères, mais pas l'alphabet (qui vous gâtera en cas d'EBCDIC, mais sérieusement, qui se soucie d'EbcDic?).


Mon père utilise toujours Ebcdic à Cobol. Il maintient des choses boeing. -_-


Donc a est la lettre de -31et de l'alphabet?


Comment imprimer le numéro d'alphabet dans l'ordre inverse comme .. 1 pour Z, 2 pour Y et ainsi de suite.



4
votes

Vous devez également prendre en compte les majuscules / minuscules. Dans mon experence, compter de 1, est souvent dangereux car il peut conduire à des bugs obsolètes. En règle générale, je me convertis toujours en un index basé sur 1 uniquement lors de l'interaction avec l'utilisateur et utilisez un comptage à 0 à l'intérieur, pour éviter toute confusion.

int GetPosition(char c)
{
   if (c >= 'a' && c <= 'z') {
      return c - 'a';
   }
   else if (c >= 'A' && c <= 'Z') {
      return c - 'A';
   }
   else  {
      // Indicate that it isn't a letter.
      return -1;
   }
}


2 commentaires

Vous pouvez le simplifier à l'aide de tolower () ou toupper () dans le ctype.h en-tête de sorte que vous n'avez pas à vérifier pour les deux et les majuscules.


J'apprécie cette réponse car elle prend en compte. Comme nous le savons bien, "A" est très différent de "A" dans de nombreux contextes logiques.



4
votes

Cela fonctionnera avec EBCDIC et est insensible à la casse: xxx

voir http: //codepad.org/5u5uo5zr si vous voulez l'exécuter.


0 commentaires