C'è un modo rapido per recuperare la posizione del personaggio data nell'alfabeto inglese in C?Come ottenere la posizione del personaggio in alfabeto in linguaggio C?
Qualcosa di simile:
int position = get_position('g');
C'è un modo rapido per recuperare la posizione del personaggio data nell'alfabeto inglese in C?Come ottenere la posizione del personaggio in alfabeto in linguaggio C?
Qualcosa di simile:
int position = get_position('g');
int position = 'g' - 'a' + 1;
In C, char
valori sono convertibili in int
valori e prendere i loro valori ASCII. In questo caso, 'a'
è lo stesso di 97 e 'g'
è 103. Poiché l'alfabeto è contiguo all'interno del set di caratteri ASCII, sottraendo 'a'
dal valore si ottiene la relativa posizione. Aggiungi 1 se consideri 'a'
la prima posizione (invece di zero).
Probabilmente si dovrebbe anche tener conto del maiuscolo/minuscolo. Nella mia esperienza, contando da 1, è spesso pericoloso perché può portare a bug fuori dall'uno. Come regola generale, mi converto sempre in un indice basato su 1 solo quando interagisco con l'utente e utilizzo internamente il conteggio a 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;
}
}
Puoi semplificarlo usando 'tolower()' o 'toupper()' nell'intestazione 'ctype.h' in modo che tu non debba controllare sia in maiuscolo sia in maiuscolo. –
questo lavoro con EBCDIC ed è case-insensitive:
#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 si desidera eseguirlo.
+1 strchr! 4321 –
è fantastico grazie – goe
Nota che ASCII non fa parte dello standard C. È abbastanza quasi ubiquitario perché funzioni su qualsiasi sistema che potresti trovare praticamente. Lo standard garantisce che le cifre siano contigue nel set di caratteri, ma non nell'alfabeto (che ti rovinerà in caso di EBCDIC, ma seriamente, a chi importa più di EBCDIC?). –
Mio padre utilizza ancora EBCDIC in COBOL. Mantiene roba Boeing. -_- – GManNickG