2016-05-16 22 views
2

那麼目前我重新創建我自己的謎的版本作爲一個小項目,但如果你瞭解謎機是如何工作的它具有一個字符連接到轉子完全不同的字符,例如A可能連接到F或U可能連接到C,並且這是完成三次。目前我使用此功能得到了轉子的字符:我應該採取什麼方法對在C轉換ASCII字符以其他字符++

char getRotorOne(char i) { 
if(i == 'a') { 
    return 'g'; 
}if(i == 'b') { 
    return 'A'; 
}if(i == 'c') { 
    return 'o'; 
} 

的主要問題,這是需要很長的時間來寫,似乎效率不高,我認爲必須有一個更好的辦法。另一個問題是在原始的謎題機器上只有26個字母的字母表,這裏有94個可以打印的ascii字符(32-126)還有其他更簡單的方法可以做到嗎?如果您認爲這個問題不清楚或者您不明白,請告訴我,而不是僅僅標記我的帖子,然後您可以幫助我改進我的問題。

+5

聲明一個char數組來保存每個索引的字符? 'char array [126] = {'a','b','c',...};返回數組['a'];' – Cyclonecode

+4

要麼'映射'或'數組'映射 – vu1p3n0x

+0

是的,但我怎麼能得到它返回結果?它需要輸入一個例如然後給我回g – Hamish

回答

7

使用表!方便地,C字符串文字是字符數組。所以,你可以這樣做:

//       abc 
const char* lower_mapping = "gAo"; 

//       ABC 
const char* upper_mapping = "xyz"; 

char getRotorOne(char i) { 
    if (i >= 'a' && i <= 'z') return lower_mapping[i - 'a']; 
    if (i >= 'A' && i <= 'Z') return upper_mapping[i - 'A']; 
    assert(false && "Unknown character cannot be mapped!"); 
} 

由於char s爲真的只是小整數和ASCII保證連續的範圍爲a-zA-Z(和0-9),你可以從給定的人物減去在其範圍內的第一個(所以,'a''A')以獲得該範圍的索引。然後可以使用該索引通過表查找相應的字符,在這種情況下,該表只是簡單的硬編碼字符串文字。

2

這是卡梅隆的回答有所改善。您應該使用每個轉子一個簡單的字符數組,但你說你想在32-126範圍內處理ASCII字符,你應該建立每個映射爲95個字符數組:

char rotor1[95] ="aXc;-0..."; // the 95 non control ascii characters in arbitrary order 

然後你這樣寫你的轉子功能:

char getRotorOne(char i) { 
    if ((i < 32) || (i > 126)) return i; // do not change non processed characters 
    return rotor1[i - 32]; // i - 32 is in range 0 - 94: rotor1[i - 32] is defined 
} 
+0

我會使用字符文字而不是整型常量來提高可讀性,它們是相同的編譯器 –

+1

@NicholasMertin:我generaly做到這一點,但在這裏明確地OP要求處理ASCII字符範圍32(空格)到126('〜'),正好給出95個字符。在這種情況下,我發現數字值更易讀,字符輸出。你真的認爲'if((i < 32) || (i > 126))'比'if((i <'')||(i>'〜'))'清楚。 Personnaly,我確實已經知道ascii代碼的空間是0x20或32,但我不得不看一張表來記住tilda的代碼是126。 –