2016-07-04 3 views
-4

シーザー・サイファーは、ユーザーが解説したキーとテキストでテキストを暗号化します。私のバージョンのシーザー暗号で何が間違っていますか? pset 2

シーザー暗号、シーザー暗号、シーザー符号またはシーザーシフトとも呼ばれるシーザー暗号は、最も簡単で最も広く知られている暗号化技術の1つです。これは、平文の各文字が、アルファベットの下のある一定数の位置の文字に置き換えられる代替暗号の一種です。たとえば、左シフトが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を入力するバック割り当てられます。おそらくラップアラウンドし、無効な値を与えます。私はXcodeの遊び場を使用してスウィフトの小さなシーザー暗号ルーチンを書いた

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

という結果がそれを見て保存するために、この使用intを解決するために

、それが役に立てば幸い:

  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)) 
関連する問題