2016-07-04 7 views
-4

Die Caesar-Chiffre verschlüsselt den Text mit benutzerdefiniertem Schlüssel und Text.Was ist falsch in meiner Version der Caesar-Chiffre? pset 2

In der Kryptographie ist eine Caesar-Chiffre, auch bekannt als Caesar-Chiffre, die Verschiebung Chiffre, Caesar-Code oder Caesar-Verschiebung, eine der einfachsten und am weitesten verbreiteten Verschlüsselungstechniken. Es ist eine Art von Ersatzchiffre, bei der jeder Buchstabe im Klartext durch einen Buchstaben mit einer bestimmten Anzahl von Stellen im Alphabet ersetzt wird. Zum Beispiel würde bei einer Linksverschiebung von 3 D durch A ersetzt, E würde zu B und so weiter. Das Verfahren wird nach Julius Caesar benannt, der es in seiner privaten Korrespondenz

#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 ; 
} 

Fakten:

:) 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

zu starten mit: Die Formatierung Ihres Programms ist falsch, Ihr Programm ist nicht lesbar. –

+0

Ich formatierte den Code für Sie in einem lesbaren Format. –

+1

Sieht aus wie kopieren Paste der Frage auf einigen Test-Server .. Wie auch immer - nette Einführung, aber keine echte Frage, vielleicht denken Sie immer noch über die Frage: D – nayana

Antwort

0

Das Problem ist, dass Sie einen char Typen verwenden die Zwischenrechnung zu speichern, die sind zu groß für diesen Typ, anstelle eines größeren Typs. Diese Berechnung:

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

der Zusatz wird in Art int aufgrund integer Aktionen durchgeführt werden, aber dann wird es zurück zu geben char zugeordnet wird, wird das Ergebnis Implementierung definiert. Es wird wahrscheinlich herumlaufen und den ungültigen Wert geben.

Um diese Verwendung int speichern Ergebnisse zu lösen, dass

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

ich eine kleine Caesar-Chiffre Routine in Swift mit Xcode Spielplatz nimmt einen Blick an ihn geschrieben, hoffe, es hilft:

  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)) 
Verwandte Themen