¿Cómo obtener la posición del personaje en el alfabeto en lenguaje C?
Pregunta
¿Hay una forma rápida de recuperar la posición de un personaje en el alfabeto inglés en C?
Algo como:
int position = get_position('g');
Solución
int position = 'g' - 'a' + 1;
En C, los valores de char
son convertibles a valores de int
y toman sus valores ASCII. En este caso, 'a'
es lo mismo que 97 y 'g'
es 103. Dado que el alfabeto es contiguo dentro del conjunto de caracteres ASCII, se resta 'a '
de su valor da su posición relativa. Agregue 1 si considera que 'a'
es la primera posición (en lugar de cero).
Otros consejos
Esto funcionará con EBCDIC y no distingue entre mayúsculas y minúsculas:
#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;
}
Consulte http://codepad.org/5u5uO5ZR si desea ejecutarlo.
También deberías tener en cuenta mayúsculas / minúsculas. En mi experiencia, contar desde 1, a menudo es peligroso porque puede dar lugar a errores off-by-one. Como regla general, siempre me convierto a un índice basado en 1 solo cuando interactúo con el usuario, y uso el conteo basado en 0 internamente, para evitar confusiones.
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;
}
}