2009-10-24 15 views

答えて

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

char値はint値に変換可能であり、それらのASCII値を取ります。この場合、'a'は97と同じで、'g'は103です。アルファベットはASCII文字セット内で連続しているため、値から'a'を引いたものが相対位置を与えます。 'a'を最初の(ゼロの代わりに)位置と見なす場合は1を加えます。

+0

ありがとうございました – goe

+5

ASCIIはC標準の一部ではありません。あなたが実際に見つけることができるシステム上で動作するには、これはほんの遍在しています。標準では、数字は文字セット内で連続していますが、アルファベットではないことが保証されています(EBCDICの場合は混乱しますが、真剣にEBCDICを気にします)。 –

+2

私のお父さんはまだCOBOLでEBCDICを使用しています。彼はボーイングを維持している。 -_- – GManNickG

3

大文字と小文字も考慮する必要があります。私のexpereinceでは、1から数えて、それはoff-by-oneバグにつながる可能性があるので、しばしば危険です。経験則として、私は常にユーザーと対話するときにのみ1ベースのインデックスに変換し、混乱を避けるために0ベースのカウントを内部的に使用します。

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

'ctype.h'ヘッダに' tolower() 'や' toupper() 'を使って簡略化すると、大文字と小文字の両方をチェックする必要はありません。 –

4

これは、EBCDICと協力し、大文字と小文字を区別しないですします:あなたはそれを実行したい場合は

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

http://codepad.org/5u5uO5ZRを参照してください。

+0

+1 strchr! 4321 –

関連する問題