2009-10-24 33 views

Trả lời

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

Trong C, char giá trị chuyển đổi cho int giá trị và đảm nhận các giá trị ASCII của họ. Trong trường hợp này, 'a' giống với 97 và 'g' là 103. Vì bảng chữ cái tiếp giáp trong bộ ký tự ASCII, trừ 'a' từ giá trị của bạn cho vị trí tương đối của nó. Thêm 1 nếu bạn xem xét 'a' làm vị trí đầu tiên (thay vì số không).

+0

đó là lời cảm ơn tuyệt vời – goe

+5

Lưu ý rằng ASCII không phải là một phần của tiêu chuẩn C. Nó chỉ gần như ở khắp mọi nơi cho việc này để làm việc trên bất kỳ hệ thống bạn thực tế có thể tìm thấy. Tiêu chuẩn đảm bảo rằng các chữ số nằm liền kề trong bộ ký tự, nhưng không phải là bảng chữ cái (điều này sẽ làm rối loạn bạn trong trường hợp EBCDIC, nhưng nghiêm túc, ai quan tâm đến EBCDIC nữa?). –

+2

Cha tôi vẫn sử dụng EBCDIC trong COBOL. Ông duy trì công cụ của Boeing. -_- – GManNickG

3

Bạn cũng nên tính đến trường hợp trên/dưới. Trong expereince của tôi, đếm từ 1, thường là nguy hiểm bởi vì nó có thể dẫn đến off-by-một lỗi. Theo quy tắc chung, tôi luôn chuyển đổi thành chỉ mục dựa trên 1 chỉ khi tương tác với người dùng và sử dụng tính toán dựa trên 0 trong nội bộ để tránh nhầm lẫn.

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

Bạn có thể đơn giản hóa nó bằng cách sử dụng hoặc là 'tolower()' hoặc 'toupper()' trong tiêu đề 'ctype.h' để bạn không phải kiểm tra cả chữ thường và chữ hoa. –

4

này sẽ làm việc với EBCDIC và là 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; 
} 

Xem http://codepad.org/5u5uO5ZR nếu bạn muốn chạy nó.

+0

+1 strchr! 4321 –

Các vấn đề liên quan