2016-04-01 6 views
4

Es ist ein einfacher Code, aber ich kann ein seltsames Ereignis nicht verstehen. Code:seltsame falsche char Verschlüsselung (ascii)

void Crittografia::CifraTesto(char text[]){ 
    int i; 
    for (i=0;i<strlen(text);i++){ 
     text[i]=text[i] + key; 
     if(text[i] > 'z'){ 
      text[i]=text[i] - 26; 
     } 
    } 
} 

erhält die Funktion die Zeichenfolge hier eingegeben: It works.
In diesem Fall funktioniert es mit einer Taste von 5. "y" geändert in "d" korrekt.

Aber in diesem Fall: Doesn't work.
Mit einem Schlüssel von 7 ändert es "y" in "Ç" anstelle des korrekten "f", also führt anscheinend die Reihe nicht aus: "text [i] = text [i] - 26;"

+0

Sie müssen lernen, wie Sie Text aus einem Konsolenfenster kopieren. Unter Windows-Betriebssystemen klicken Sie mit der rechten Maustaste auf die Titelleiste und wählen Sie Bearbeiten-> Markieren. Markieren Sie mit der Maus die zu kopierende Region und drücken Sie dann die Eingabetaste. Dadurch wird der markierte Text in die Zwischenablage kopiert, sodass er in Ihre Frage eingefügt werden kann. –

+1

Eine [ASCII-Tabellenreferenz] (http://en.cppreference.com/w/c/language/ascii) könnte ein guter Anfang sein. Dann könnten Sie wissen warum z. 'someCharacteer - 26' ist vielleicht keine so gute Idee. –

+0

Es gibt kein '::' in C, also ist deine Frage auch nicht "C". –

Antwort

2

Wie Giorgi sagte, Ihr Problem mit Überlauf ist. Sie können dies vermeiden, indem Sie key von beiden Seiten der Ungleichheit subtrahieren:

for (int i=0; text[i]; i++) { 
    if (text[i] > 'z' - key) // check whether (text[i] + key) would be past `z` 
     text[i] -= 26 - key; 
    else 
     text[i] += key; 
} 
4

Text [i] = Text [i] + Taste;

Wenn die Taste 7 und text[i] ist 'y' Additionsergebnis passt nicht in char (scheint Ihr Zeichen ist unterzeichnet) und das Ergebnis ist die Umsetzung definiert.

Sie sind besser, einen Modulo-Operator in der Addition zu verwenden. z.B.

text[i]= (text[i] - 'a' + key) % 26 + 'a'; 
2

Sie müssen den Modul Operator verwenden, '%'.
Durchsuchen Sie StackOverflow nach "C++ Caesar Cipher" für weitere Beispiele dieser Zuordnung.

Beispiel:

new_letter = (old_letter - 'a'); // Set the range from 0 to 25. 
new_letter = (new_letter + key) % 26; // 26 letters in the alphabet. 
new_letter += 'a'; // Convert back to a letter. 
+0

Modul ist nützlich, aber nicht notwendig. Zusätzlich kann man den Modulus berechnen, ohne '%' zu verwenden. –

+0

@BenVoigt Aber wir alle verwenden Modul und OP wird es in jedem anderen Code sehen. – nicomp