2016-04-09 4 views
-2

Die Aufgabe besteht darin, den Satz zu verschlüsseln: "Mein Hovercraft ist voller Aale." Ich verpasste die Übung Klasse aufgrund anderer Aufgaben;) Wie auch immer, ich kam zu einem Ergebnis von Sniplets ich im Internet gefunden und ein bisschen experimentieren. es geht wie folgt:Basic Caesars Code; Zeichenfolge verschlüsseln. Bitte erkläre, was ich getan habe: D

#include <stdio.h> 
int main() 
{ 

int i=0; 
char str[]="My hovercraft is full of eels."; 
char c; 
while (str[i])  //While String is true (Still characters left) 
{ 
    if (str[i]!='z') //if character is NOT "z" shift character by one 
     { 
    (c=str[i]+1); 
     } 
    else { 
      (c=str[i]='a'); //if character equals "z" then the output is "a" 
     } 


    printf("%c" ,c); // Shows encrypted string 
    i++; 
    } 
return 0; 
} 

Mein Problem ist, ich weiß nicht, was ich wirklich tat. Könnte jemand meinen Code erklären? : D

Zuerst führe ich die Ganzzahl i ein, die = 0 ist, dann eine Zeichenkette und die Variable c, die auch ein Zeichen ist. während Zeichen in der Zeichenfolge verbleiben, addiere 1, wenn es nicht gleich z ist andernfalls ist c gleich a. also z = a aber ich weiß ehrlich nicht, warum es i ++ braucht, das ich von einem weit komplexeren caesars code kopierte. So, das war es.

+3

Wenn Sie nicht wissen, was dieser Code bedeutet, haben Sie wahrscheinlich nicht geschrieben (oder es funktioniert nicht). Wie auch immer, erstellen Sie eine Schritt-für-Schritt-Beschreibung des Algorithmus aus Wikipedia und versuchen Sie, nach diesen Schritten in Ihrem Code zu suchen. Der Kursleiter verlangt von Ihnen, dass Sie Ihren Code erklären, um zu überprüfen, ob Sie ihn wirklich geschrieben haben, weil Sie die Konzepte dessen, was Sie schreiben, verstehen müssen, um es zu schreiben. –

+0

Bitte verwenden Sie keine magischen Zahlen, verwenden Sie "a" und "z", da klarer wird, was der Code macht, und portabler. –

+0

Na dann, ich werde versuchen, es zu erklären: – Twizzler

Antwort

0
while (str[i])  //While String is true (Still characters left) 

Schalt Dies ist ein sehr häufiges C Idiom, aber es ist eigentlich ein heikles Stück Code. i ist Ihr Index in die Zeichenfolge. Wenn i 0 ist, ist str[i] das erste Zeichen der Zeichenfolge (d. H. "Erstes Zeichen plus null Zeichen"). Wenn i 1 ist, ist es das zweite Zeichen der Zeichenfolge ("erstes Zeichen plus ein Zeichen").

Ein "Zeichen" in C ist nur eine Zahl. So ist der Buchstabe "A" zufällig 65. Ihre Zeichenfolge lautet:

char str[]="My hovercraft is full of eels."; 

Also das ist wirklich eine Reihe von Zahlen. Was nicht offensichtlich ist, ist, dass C automatisch eine Null an das Ende der Zeichenfolge anfügt. Also das ist wirklich nur eine Bequemlichkeit für:

char str[] = { 'M', 'y', ' ', 'h', ... 'l', 's', '.', '\0' }; 

Die letzten \0NUL genannt wird (oder manchmal auch „null“). Es ist ein Charakter (ein "Buchstabe"). Es ist einfach das Zeichen mit dem Wert Null. Und es markiert das Ende einer Zeichenfolge. Dieses "Array von bytegroßen Zeichen, gefolgt von einem NUL" ist in C unglaublich häufig und wird weithin als cstring ("C-String") bezeichnet, selbst wenn es in anderen Sprachen angezeigt wird. Dies ist nicht die einzige Möglichkeit, Zeichenfolgen darzustellen, aber es ist bei weitem am häufigsten in C, und es ist, was Sie erhalten, wenn Sie die "..." Syntax verwenden.

Also jedes Zeichen ist eine Zahl, und das letzte Zeichen ist Null. Jetzt verwenden wir ein anderes gängiges C-Idiom: Null ist falsch, alle anderen Werte sind wahr. So ist while (str[i]) entspricht:

while (str[i] != 0) 

oder noch genauer:

while (str[i] != '\0') 

Welche ist eine unglaublich langatmig Art zu sagen, „bis i bis zum Ende des Strings bezieht."

(nicht verzweifeln. Der Rest ist überraschend einfach im Vergleich zu dieser ersten Zeile. Aber das erste Zeile ist unglaublich häufig in C, so dass Sie all die kleinen Dinge verstehen müssen, die passiert sind.)

if (str[i]!='z') //if character is NOT "z" shift character by one 

Easy-peasy. Wenn das aktuelle Zeichen zu suchen wir kein z ist ... „wir betrachten“ von i definiert ist.

(c=str[i]+1); 

Sie wissen nicht, warum es Klammern hier. Das ist irgendwie ungewöhnlich. Aber der Punkt ist, einfach zu nehmen das Zeichen, das wir betrachten, und fügen Sie eins zu der numerischen Darstellung davon hinzu und weisen Sie das c zu. Da sowohl ASCII als auch UTF8 (zwei sehr gebräuchliche Arten zum Codieren von Strings) das lateinische Alphabet in eine Reihenfolge bringen, ist "a + 1" "b".

Beachten Sie, dass dies nicht ist, die eine richtige Caesar-Chiffre implementiert. In einer traditionellen Caesar-Chiffre mit Offset 1 würde "Z" zu "A" wechseln. In dieser Chiffre wird "Z" zu "[" verschoben. Aber ich bin pedantisch. Es ist nur zu verstehen, dass diese Chiffre einige überraschende Eckfälle hat. Zum Beispiel wird es sowohl z als auch Backtick ` als a codieren, so dass es technisch Informationen verlieren kann und nicht über willkürliche ASCII-Eingabe rückgängig gemacht werden kann (es ist vollständig für UTF8-Eingang gebrochen, so dass wir das hier nicht einmal diskutieren). Keine große Sache, aber als Programmierer sind Corner Cases unser Leben, also ist es gut zu wissen, für welche Inputs das funktioniert und für welche Inputs es nicht funktioniert.

(c=str[i]='a'); //if character equals "z" then the output is "a" 

Diese Zeile ist mit ziemlicher Sicherheit ein Fehler. Die Klammern sind wieder komisch, aber kein Problem. Das Problem mit dieser Codezeile ist, dass es str ändert, was der vorherige Code nicht tat. Mit ziemlicher Sicherheit sollte dieser Code lesen:

c = 'a'; 

Wenn das aktuelle Zeichen z ist, sollte der Ausgang a sein.

printf("%c" ,c); // Shows encrypted string 

Der Kommentar hier ist ein wenig irreführend. Es sollte sagen "zeigt verschlüsselte Zeichen."

Und wir bewegen unseren Index um ein Zeichen vor dem Start des Prozesses erneut. i++ ist nur ein C-ism für i = i + 1. (Es ist etwas komplizierter als das, wenn es innerhalb eines Ausdrucks erscheint, aber in diesem Fall könnten Sie genau ersetzen Sie es mit i = i + 1.)

return 0; 

Und im Unix-Stil (die C tief mit ist verflochten), main() gibt Null zurück, um "kein Fehler" zu bedeuten.

+0

thx Mann, das ist viel mehr ins Detail als ich erwartet habe, vielen Dank für Ihre Zeit! A + für Aufwand: D Ich habe es ohne Klammern bearbeitet und ersetzt c = 'a'; Also danke auch dafür. – Twizzler

0

Grundsätzlich ist es so, dass es auf jeden Buchstaben in der while-Schleife zugreift und referenziert wird, wenn str[i] verwendet wird. Wenn der Buchstabe nicht z ist, bewegt er ihn um einen Buchstaben nach oben, so dass abcbcd zurückgibt. Wenn der Buchstabe z ist, wird er zu a.

Sie können leicht das Programm modifizieren, um die Ausgabe zu entschlüsseln, indem str[i]+1 auf -1 ändern und

Verwandte Themen