2009-11-17 18 views
-1

所以,你必須映射表上英文字母的26個ASCII字符及其對應的摩爾斯電碼串如何返回的ASCII字符的索引,用C

typedef struct a_look_tab { 
    char table[asciiNum][MORSE_MAX+1]; 

} ALookTab; 

和asciiNum爲B中的0表示,1 , 等等。如何返回一個索引(int),它是莫爾斯字符的索引。

所以我們在將一個char轉換爲數字後所做的是param ascii轉換和返回的ascii字符給定ascii字符的索引,我們該怎麼做?

+1

這個問題是可以理解的很少,你應該編輯和改換 – 2009-11-17 07:27:06

+0

是更好? – c2009l123 2009-11-17 07:29:42

+0

您想將ASCII字符轉換爲數字。例如,a-> 0 b-> 1等。怎麼做?這是個問題嗎? – Naveen 2009-11-17 07:34:37

回答

2

您需要將字符(如'a')轉換爲表格中的索引。根據你的規範,表格以'a'的摩爾斯碼開始,所以'a'應該映射到索引0,'b'映射到1,依此類推。

最簡單的這種映射可被實現這樣的:

int char_to_index(char c) 
{ 
    return tolower(c) - 'a'; 
} 

這減去ASCII代碼爲「A」從給定的字母,這會變成「A」轉換成0,依此類推。

不幸的是,這隻有在運行程序的計算機使用爲字母指定連續代碼的系統對字母表中的字母進行編碼時纔有效。並非所有的電腦都是這樣的。更便攜的功能可以明確地進行映射,如下所示:

int char_to_index2(char c) 
{ 
    switch(tolower(c)) 
    { 
    case 'a': return 0; 
    case 'b': return 1; 
    case 'c': return 2; 
    /* and so on */ 
    } 
} 

這更詳細的代碼方式,但更便攜。

更新:我增加了對tolower()這兩個函數的調用,使它們更健壯一些。

+0

爲了記錄,我願意'切換(tolower(c))''但那是因爲我喜歡不區分大小寫(大寫K對它的情況非常敏感)。 – 2009-11-17 07:49:58

+0

@Chris:同意。我的目標是實現最大程度的透明度/簡單性,但對tolower()的要求並沒有太多要求。 :) 謝謝! – unwind 2009-11-17 08:04:33

2

請注意,C標準不需要ASCII,並且此代碼在EBCDIC下不起作用,但99%的時間無關緊要。

我相信你要找的東西比你想像的要簡單得多。字符文字如'c''0'實際上是int s,而不是char s - 它們被分配到char,並且可以很容易地恢復。因此,這是你想要的(我認爲):

#include <ctype.h> // for tolower() 

char *func(ALookTab *a, char c) 
{ 
    if(isalpha(c)) 
     return a->table[tolower(c) - 'a']; 
    if(isdigit(c)) 
     return a->table[c - '0' + 26]; 
    // handle special characters 
} 

注意,此代碼假定您的莫爾斯電碼被存儲爲26個英文字母的字符,10個數字,然後在你選擇的任何順序其他特殊字符。

3

的字符轉換爲指數的最簡單便攜式方式是這種結構類型:

/* Returns -1 if c is not an upper- or lower-case alphabetical character */ 
int char_to_index(char c) 
{ 
    static const char * const alphabet = "abcdefghijklmnopqrstuvwxyz"; 
    char *p = strchr(alphabet, tolower((unsigned char)c)); 

    return p ? p - alphabet : -1; 
}