2017-11-02 3 views
2

Ich versuche, ein Caesar-Chiffre-Programm zu erstellen, jedoch kann ich die Leerzeichen aus der endgültigen verschlüsselten Ausgabe nicht entfernen. Ich benutzte:Problem mit dem Entfernen von Leerzeichen aus Zeichenfolge in Caesar-Chiffre C#

if (letter == ' ') 
       continue; 

Allerdings scheint dies nicht zu funktionieren und ich kann nicht identifizieren, was das Problem verursacht. Ich habe nicht sehr lange mit C# gearbeitet, also könnte es möglicherweise ein dummer Fehler sein.

Wenn ich zur Eingabe war der Satz mit einer Verschiebung von 7: „Ich brauche Hilfe“ die folgende Ausgabe pAullkAolsw sein würde, mit allen Räumen Groß A. Werden Die Ausgabe Ich mag, sollte in dem Beispiel haben: p ullk olsw .

Unten ist mein voller Code:

using System; 

class Program 
{ 

static string Caesar(string value, int shift) 
{ 
    char[] buffer = value.ToCharArray(); 
    for (int i = 0; i < buffer.Length; i++) 
    { 

     char letter = buffer[i]; 

     letter = (char)(letter + shift); 


     if (letter == ' ') 
      continue; 

     if (letter > 'z') 
     { 
      letter = (char)(letter - 26); 
     } 
     else if (letter < 'a') 
     { 
      letter = (char)(letter + 26); 
     } 


     buffer[i] = letter; 
    } 
    return new string(buffer); 
} 

static void Main() 
{ 
    Console.WriteLine("Enter text to encrypt: "); 
    string buffer = Console.ReadLine(); 
    Console.WriteLine("Enter value of shift: "); 
    int shift = int.Parse(Console.ReadLine()); 

    string final = Caesar(buffer, shift); 

    Console.WriteLine(final); 
    } 
} 
+0

Sie überprüfen, ob der verschobene Buchstabe '' ist. Sie müssen vor der Schicht überprüfen. EDIT: Wenn Sie die Leerzeichen vollständig entfernen möchten, müssen Sie in ein neues Zeichen [] schreiben, anstatt den Puffer [i] zu ändern. (Beachten Sie, dass Sie beim Entschlüsseln keine Leerzeichen haben werden) – TheSkimek

+0

ja dummer Fehler: Testen Sie den Platz, bevor Sie die + Verschiebung ausführen. – Rob

+0

Ja, es scheint jetzt offensichtlich zu sein, zumindest werde ich es in Zukunft erinnern –

Antwort

2

Wenn Sie möchten, Räume überspringen Sie müssen nur überprüfen, bevor Sie den Buchstaben Variable umwandeln:

char letter = buffer[i]; 
if (letter == ' ') 
    continue; 

letter = (char)(letter + shift); 
// ... 
+0

Vielen Dank dafür, ich habe nicht einmal daran gedacht, die Reihenfolge zu berücksichtigen, in der der Code läuft. –

0

Sie sollten verschlüsselt werden, wenn und nur Wenn Sie wissen, , wie es zu tun ist (dh wenn Sie ein a..z oder A..Z Zeichen haben); falls Sie unterschiedliche Zeichen (Leerzeichen, Minuszeichen, Anführungszeichen, was auch immer), nur es intakt lassen:

using System.Linq; 

... 

static string Caesar(string value, int shift) { 
    //DONE: do not forget about validation 
    if (null == value) 
    return value; // or throw exception (ArgumentNullValue) 

    int n = 'z' - 'a' + 1; 

    // For each character in the value we have three cases: 
    // a..z letters - encrypt 
    // A..Z letters - encrypt 
    // other letters - leave intact 
    // "n + shift % n) % n" - let's support arbitrary shifts, e.g. 2017, -12345 etc. 
    return string.Concat(value 
    .Select(c => 
     c >= 'a' && c <= 'z' ? (char) ('a' + (c - 'a' + n + shift % n) % n) 
     : c >= 'A' && c <= 'Z' ? (char) ('A' + (c - 'A' + n + shift % n) % n) 
     : c)); 
} 

Test:

Console.Write(Caesar("Hello! It's a test for so called 'Caesar cipher'.", -2)); 

Ergebnis (bitte beachten Sie, dass Räume , Apostrophe, Ausrufezeichen bleiben, wie sie waren):

Fcjjm! Gr'q y rcqr dmp qm ayjjcb 'Aycqyp agnfcp'. 
Verwandte Themen