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');
Était-ce utile?

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;
   }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top