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 \0
NUL
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.
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. –
Bitte verwenden Sie keine magischen Zahlen, verwenden Sie "a" und "z", da klarer wird, was der Code macht, und portabler. –
Na dann, ich werde versuchen, es zu erklären: – Twizzler