2009-10-24 3 views

Antwort

26
int position = 'g' - 'a' + 1; 

In C sind char Werte int Werte konvertierbar und auf ihre ASCII-Werte nehmen. In diesem Fall ist 'a' das gleiche wie 97 und 'g' ist 103. Da das Alphabet innerhalb des ASCII-Zeichensatzes zusammenhängend ist, ergibt die Subtraktion 'a' von Ihrem Wert seine relative Position. Fügen Sie 1 hinzu, wenn Sie 'a' als erste (anstelle von null) Position betrachten.

+0

das ist großartig danke – goe

+5

Beachten Sie, dass ASCII nicht Teil des C-Standards ist. Es ist fast allgegenwärtig genug, um an jedem System zu arbeiten, das man praktisch finden kann. Der Standard garantiert, dass die Ziffern zusammenhängend im Zeichensatz sind, aber nicht das Alphabet (was Sie im Falle von EBCDIC in die Irre führen wird, aber ernsthaft, wer interessiert sich mehr für EBCDIC?). –

+2

Mein Vater verwendet immer noch EBCDIC in COBOL. Er pflegt Boeing-Sachen. -_- – GManNickG

3

Sie sollten wahrscheinlich auch Groß-/Kleinschreibung berücksichtigen. In meiner Erfahrung ist das Zählen von 1 oft gefährlich, weil es zu Fehlern führen kann. Als Faustregel gilt: Ich konvertiere immer nur zu einem 1-basierten Index, wenn ich mit dem Benutzer interagiere, und verwende 0-basiertes Zählen intern, um Verwirrung zu vermeiden.

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

Sie könnten es vereinfachen, indem Sie entweder 'tolower()' oder 'toupper()' in der Kopfzeile 'ctype.h' verwenden, so dass Sie nicht nach Klein- und Großbuchstaben suchen müssen. –

4

Dies wird mit EBCDIC arbeiten und ist Groß- und Kleinschreibung:

#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; 
} 

Siehe http://codepad.org/5u5uO5ZR, wenn Sie es ausführen möchten.

+0

+1 strchr! 4321 –

Verwandte Themen