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');
È stato utile?

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;
   }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top