Comment obtenir la position du personnage dans l'alphabet en langage C?
Question
Existe-t-il un moyen rapide de retrouver la position d'un personnage dans l'alphabet anglais en C?
Quelque chose comme:
int position = get_position('g');
La solution
int position = 'g' - 'a' + 1;
En C, les valeurs char
sont convertibles en valeurs int
et prennent leurs valeurs ASCII. Dans ce cas, 'a'
est identique à 97 et 'g'
à 103. Puisque l'alphabet est contigu dans le jeu de caractères ASCII, soustrayez 'a '
de votre valeur donne sa position relative. Ajoutez 1 si vous considérez que 'a'
est la première position (au lieu de zeroth).
Autres conseils
Cela fonctionnera avec EBCDIC et respectera la casse:
#include <ctype.h>
#include <stdio.h>
#include <string.h>
int getpos (char c)
{
int pos;
const char * alphabet = "abcdefghijklmnopqrstuvwxyz";
const char * found;
c = tolower ((unsigned char)c);
found = strchr (alphabet, c);
pos = found - alphabet;
if (!found)
pos = 0;
else if (pos == 26)
pos = 0;
else
pos++;
return pos;
}
int main ()
{
char tests[] = {'A', '%', 'a', 'z', 'M', 0};
char * c;
for (c = tests; *c; c++) {
printf ("%d\n", *c - 'a' + 1);
printf ("%d\n", getpos (*c));
}
return 0;
}
Si vous souhaitez le lancer, consultez http://codepad.org/5u5uO5ZR .
Vous devriez également probablement prendre en compte les majuscules / minuscules. Dans mon expérience, compter à partir de 1 est souvent dangereux car cela peut conduire à des bogues inattendus. En règle générale, je convertis toujours en un index basé sur 1 uniquement lors d'une interaction avec l'utilisateur et utilise le comptage basé sur 0 en interne 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;
}
}