Existe-t-il un moyen rapide de récupérer la position d'un caractère donné dans l'alphabet anglais en C?Comment obtenir la position du personnage dans l'alphabet en langage C?
Quelque chose comme:
int position = get_position('g');
Existe-t-il un moyen rapide de récupérer la position d'un caractère donné dans l'alphabet anglais en C?Comment obtenir la position du personnage dans l'alphabet en langage C?
Quelque chose comme:
int position = get_position('g');
int position = 'g' - 'a' + 1;
En C, char
valeurs sont convertibles en valeurs int
et prendre leurs valeurs ASCII. Dans ce cas, 'a'
est le même que 97 et 'g'
est 103. Puisque l'alphabet est contigu dans le jeu de caractères ASCII, soustraire 'a'
de votre valeur donne sa position relative. Ajoutez 1 si vous considérez 'a'
comme la première position (au lieu de zéro).
Vous devriez également prendre en compte les majuscules/minuscules. Dans mon expérience, à partir de 1, est souvent dangereux, car il peut conduire à des bogues hors-un. En règle générale, je convertis toujours en un index basé sur 1 uniquement lorsque j'interagis avec l'utilisateur, et j'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;
}
}
Vous pouvez le simplifier en utilisant 'tolower()' ou 'toupper()' dans l'en-tête 'ctype.h' pour ne pas avoir à vérifier à la fois les majuscules et les minuscules. –
Cela fonctionne avec EBCDIC et est insensible à 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;
}
Voir http://codepad.org/5u5uO5ZR si vous voulez exécuter.
+1 strchr! 4321 –
c'est génial merci – goe
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 pourriez pratiquement trouver. La norme garantit que les chiffres sont contigus dans le jeu de caractères, mais pas l'alphabet (ce qui vous gâchera dans le cas d'EBCDIC, mais sérieusement, qui se soucie plus d'EBCDIC?). –
Mon père utilise toujours EBCDIC dans COBOL. Il maintient des trucs Boeing. -0- – GManNickG