2012-12-04 102 views
0

我想創建一個使用C++的凱撒密碼。我有一個文本文件讀取程序,但我需要它來加密文本並輸出到屏幕上。凱撒密碼輸入文本文件

這是我的加密代碼,但我似乎無法得到它的工作。我只是剛剛開始使用C++,並不確定從哪裏開始。

cout << "enter a value between 1-26 to encrypt the text: "; 
cin >> shift; 

while ((shift <1) || (shift >26)) { 
    cout << "Enter a value between 1 and 26!: "; 
    cin >> shift; 
} 

int size = strlen(text); 
int i=0; 

for(i=0; i<size; i++) { 
    cipher[i] = (text[i]); 
    if (islower(text[i])) { 
     if (text[i] > 122) { 
      cipher[i] = ((int)(text[i] - 26) + shift); 
     } 
    } else if (isupper(text[i])) { 
     if (text[i] > 90) { 
      cipher[i] = ((int)(text[i] - 26) + shift); 
     } 
    } 
} 

cipher[size] = '\0'; 
cout << cipher << endl; 
+2

你的縮進確實是任意的,使代碼難以閱讀。請解決這個問題,並且[發佈一個最小的,**完整的**,編譯代碼](http://sscce.org/),我們可以檢查。 –

+2

歡迎來到StackOverflow。 1)修正你的縮進,2)學習創建最小的,自包含的例子,3)看看C++中的模運算符('%'和'%=')。 – Beta

+0

正如@Beta所說,檢查模運算符(%),這是您的解決方案。 – m0skit0

回答

0

重新格式化,由編譯廣告固定算法(以我認爲是試圖實現)

#include <iostream> 
using namespace std; 

char text[] = {"This is my encryption code but I can't seem to get it to work. " 
       "I have only just started using C++ and not really sure where " 
       "to go from here."}; 
char cipher[sizeof(text)]; 

void main() 
{ 
    int shift; 
    do { 
     cout << "enter a value between 1-26 to encrypt the text: "; 
     cin >> shift; 
    } while ((shift <1) || (shift >26)); 

    int size = strlen(text); 
    int i=0; 

    for(i=0; i<size; i++) 
    { 
     cipher[i] = text[i]; 
     if (islower(cipher[i])) { 
      cipher[i] = (cipher[i]-'a'+shift)%26+'a'; 
     } 
     else if (isupper(cipher[i])) { 
      cipher[i] = (cipher[i]-'A'+shift)%26+'A'; 
     } 
    } 

    cipher[size] = '\0'; 
    cout << cipher << endl; 
} 
+0

哎呀,找到錯誤!應該完全改寫它:-) – stefan

+0

修復它自己,不能離開它。對於那些想要查看錯誤的人,請查看歷史記錄。 – stefan

+0

非常感謝您的幫助,我明白我現在做錯了什麼,迴應也很快。再次感謝。 – nthnwddll

1

首先,你的算法是錯誤的。

如果我們假設ASCII輸入,那麼你需要加密介於32(即空格)和126(即波浪號〜)之間的值,包括在內。您可以通過將該鍵(單個數字)添加到該值來完成此操作。如果結果大於126(最高可用字符),則需要環繞並從32開始計數。這意味着126 + 1 = 32,126 + 2 = 33等。查找「模數」。

我建議你查一下「調試」一詞。一般來說,當你有一個算法時,你可以儘可能編寫與算法匹配的代碼。如果結果不是預期的結果,那麼你使用調試器一行一行,直到你發現這行是你的預期結果,並且你的代碼的結果不再匹配。

0

有幾件事情:

  1. 要檢查,如果字符islower,然後檢查是否 ASCII值是> 122。這永遠不會是真的。在缺省 區域設置(標準ascii)中,islower()只有在ascii 值在[97,122](a-z)範圍內時纔會成立。 isupper()也是如此。它僅在65和 90之間的ascii值(包括這兩個值)返回true。
  2. 無論如何,您已經在使用ascii值,因此islower()isupper()可能是多餘的。這些相當於對範圍進行邊界檢查,即text[i] >= 97 && text[i] <= 122。它們是有用的快捷方式,但如果可以簡化,則不要將代碼放在它們的周圍。
  3. 如果價值是< = 90/122,您的代碼永遠不會增加凱撒班次,所以您永遠不會移動任何東西。