2016-07-04 74 views
-4

凱撒密碼使用用戶定義的密鑰和文本加密文本。我的凱撒密碼版本有什麼問題? pset 2

在密碼學中,凱撒密碼也被稱爲凱撒密碼,密碼轉換,凱撒代碼或凱撒轉換,是最簡單和最廣爲人知的加密技術之一。它是一種替代密碼,其中明文中的每個字母被一個字母替換爲一個固定數量的字母。例如,如果左移3,則D將被替換爲A,E將變爲B,等等。該方法是凱撒,誰在他的私人信件用它

#include <stdio.h> 
#include <cs50.h> 
#include <ctype.h> 


int main (int argc , string argv[]) 
{  
    int key,save; 
    string s ; 

    key = atoi(argv[1]);  
    s = GetString(); 

    if ( argc != 2) 
    { 
    printf("prgram is yelling at you !!"); 
    return 1 ; 
    } 

    for (int i = 0 ; s[i]!='\0' ; ++i) // manipulation without storing character 
    { 
    if (isalpha(s[i]))   // checks whether input is in character set or not 
    { 
     if (islower (s[i]))  // FOR LOWER CASES 
     { 
     save = key % 24 ; 
     s[i] = s[i] + save ; 

     if (s[i] > 'z') 
      s[i] = 'a' + (s[i] - 'z' -1); 
     } 

     if (isupper (s[i]))  // FOR UPPER CASES 
     { 
     save = key % 24 ; 
     s[i] = s[i] + save ; 

     if (s[i] > 'Z') 
      s[i] = 'A' + (s[i] - 'Z' -1); 
     } 
    } 

    printf ("%c" , s[i]); 
    } 

    return 0 ; 
} 

事實而得名:

:) caesar.c exists 
:) caesar.c compiles 
:(encrypts "a" as "b" using 1 a s key 
    \ expected output, but not "b" 
:(encrypts "barfoo" as "yxocll" using 23 as key 
    \ expected output, but not "yxc" 
:(encrypts "BARFOO" as "EDUIRR" using 3 as key 
    \ expected output, but not "EDUIRR" 
    :(encrypts "BaRFoo" as "FeVJss" using 4 as key 
     \ expected output, but not "FeVJss" 
    :(encrypts "barfoo" as "onesbb" using 65 as key 
     \ expected output, but not "srw" 
    :(encrypts "world, say hello!" as "iadxp, emk tqxxa!" using 12 as key 
     \ expected output, but not "adxp, em tqxxa!" 

    :(handles lack of argv[1] 
     \ expected output, not standard error of \  "/opt/sandbox50/bin/run.sh: line 31: 189..." 
+1

啓動與:你的程序的格式是錯誤的,你的程序是不可讀的。 –

+0

我將代碼格式化爲一些可讀的格式。 –

+1

這看起來像一些測試服務器上的問題複製粘貼..無論如何 - 很好的介紹,但沒有真正的問題,也許你還在想這個問題:D – nayana

回答

0

的問題是,您使用的是char類型來存儲中間計算其對於那種類型來說太大了,而不是更大的類型。計算:

s[i] = s[i] + save ; 

加入將在int類型來完成,由於整促銷活動,但隨後將被分配回鍵入char,結果會實現定義。它可能會環繞並給出無效值。

爲了解決這個使用int存儲結果

int temp = s[i] + save; 
if (temp > 'z') 
    temp = 'a' + (temp - 'z' -1); 
s[i] = temp; 
0

我使用Xcode的操場就來看看它寫了一個小愷撒密碼例行斯威夫特,希望它有助於:

  import UIKit 

      let letters:[String] = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"] 

      var message: String = "HERE GOES THE TEXT THAT YOU WANT TO ENCRYPT" 

      func encryptMessage(message: String, shift: Int) -> String { 
       var count = 0 
       var letterIndex = 0 
       var encryptedMessage = "" 
       for i in message.stringByReplacingOccurrencesOfString(" ", withString: "").characters { 
        letterIndex = letters.indexOf(String(i))! + shift 
        if letterIndex >= 26 { 
         letterIndex = letterIndex - 26 
        } 
        count = count + 1 
        encryptedMessage += letters[letterIndex] 
       } 
       return encryptedMessage 
      } 

      func decryptMessage(message: String, shift: Int) -> String { 
       var count = 0 
       var letterIndex = 0 
       var decryptedMessage = "" 
       for i in message.stringByReplacingOccurrencesOfString(" ", withString: "").characters { 
        letterIndex = letters.indexOf(String(i))! - shift 
        if letterIndex < 0 { 
         letterIndex = 26 + letterIndex 
        } 
        count = count + 1 
        decryptedMessage += letters[letterIndex] 
       } 
       return decryptedMessage 
      } 
      // Encrypt Message By Shifting 5 positions to the right in the alphabet letters array (A becomes F, B becomes G...) 
      print(encryptMessage(message,shift: 5)) 
      // Decrypt Message By Shifting 5 positions to the left in the alphabet letters array (F becomes A, G becomes B...) 
      print(decryptMessage(encryptMessage(message,shift: 5),shift: 5))