2009-10-24 184 views

回答

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

在C,char值转换为int值,并采取他们的ASCII值。在这种情况下,'a'与97相同,而'g'的值为103.由于字母表在ASCII字符集内是连续的,因此从您的值中减去'a'将给出其相对位置。如果您认为'a'是第一个(而不是第零个)位置,请加1。

+0

非常感谢 – goe 2009-10-24 02:01:07

+5

请注意,ASCII不是C标准的一部分。它几乎无处不在,因此可以在任何可以实际找到的系统上工作。该标准保证字符集中的数字是连续的,但不包括字母表(在EBCDIC的情况下会让你感到困惑,但是认真地说,谁在乎EBCDIC呢?)。 – 2009-10-24 02:06:16

+2

我爸还在COBOL中使用EBCDIC。他维护波音的东西。 -_- – GManNickG 2009-10-24 02:37:59

3

你也应该考虑大写/小写。在我的经验中,从1开始计数通常是危险的,因为它可能导致错误的错误。作为一个经验法则,我总是只在与用户交互时转换为基于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()'来简化它,这样你就不必检查小写字母和大写字母。 – 2009-10-24 02:39:51

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 – 2012-01-07 07:17:41