2009-10-24 7 views

risposta

26
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).

+0

è fantastico grazie – goe

+5

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?). –

+2

Mio padre utilizza ancora EBCDIC in COBOL. Mantiene roba Boeing. -_- – GManNickG

3

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; 
    } 
} 
+1

Puoi semplificarlo usando 'tolower()' o 'toupper()' nell'intestazione 'ctype.h' in modo che tu non debba controllare sia in maiuscolo sia in maiuscolo. –

4

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.

+0

+1 strchr! 4321 –

Problemi correlati