Come ottenere la posizione del personaggio in alfabeto in linguaggio C?
Domanda
Esiste un modo rapido per recuperare la posizione di un determinato personaggio nell'alfabeto inglese in C?
Qualcosa del tipo:
int position = get_position('g');
Soluzione
int position = 'g' - 'a' + 1;
In C, i valori char
sono convertibili in int
e assumono i loro valori ASCII. In questo caso, 'a'
è uguale a 97 e 'g'
è 103. Poiché l'alfabeto è contiguo all'interno del set di caratteri ASCII, sottraendo 'a '
dal tuo valore indica la sua posizione relativa. Aggiungi 1 se consideri 'a'
come prima posizione (anziché zeroth).
Altri suggerimenti
Funzionerà con EBCDIC e non fa distinzione tra maiuscole e minuscole:
#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;
}
Vedi http://codepad.org/5u5uO5ZR se vuoi eseguirlo.
Probabilmente dovresti anche tener conto delle maiuscole / minuscole. Nella mia esperienza, contando da 1, è spesso pericoloso perché può portare a bug singoli. Come regola pratica, converto sempre in un indice basato su 1 solo quando interagisco con l'utente e utilizzo internamente il conteggio basato su 0, per evitare confusione.
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;
}
}