Gibt es eine schnelle Möglichkeit, die Position des gegebenen Zeichens im englischen Alphabet in C abzurufen?Wie erhält man die Position eines Buchstabens in der C-Sprache?
Etwas wie:
int position = get_position('g');
Gibt es eine schnelle Möglichkeit, die Position des gegebenen Zeichens im englischen Alphabet in C abzurufen?Wie erhält man die Position eines Buchstabens in der C-Sprache?
Etwas wie:
int position = get_position('g');
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.
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;
}
}
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. –
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.
+1 strchr! 4321 –
das ist großartig danke – goe
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?). –
Mein Vater verwendet immer noch EBCDIC in COBOL. Er pflegt Boeing-Sachen. -_- – GManNickG