while (str[i]) //While String is true (Still characters left)
這是一個很常見的C成語來解密輸出,但它實際上是一個棘手的一段代碼。 i
是您的字符串索引。當i
爲0時,str[i]
是該字符串的第一個字符(即「第一個字符加零字符」)。當i
爲1時,它是該字符串的第二個字符(「第一個字符加一個字符」)。
C中的「字符」只是一個數字。所以字母「A」碰巧是65.你的字符串是:
char str[]="My hovercraft is full of eels.";
所以這是一個真正的數字數組。不明顯的是C會自動在字符串的末尾添加一個零。因此,這實際上只是一個方便:
char str[] = { 'M', 'y', ' ', 'h', ... 'l', 's', '.', '\0' };
這最後\0
被稱爲NUL
(或有時「空」)。這是一個字符(一個「字母」)。它恰好是零值的字符。它標誌着一個字符串的結束。這個「字節大小的字符數組,後跟一個NUL
」在C中非常常見,並且被廣泛稱爲cstring(「C string」),即使它在其他語言中出現時也是如此。這是而不是表示字符串的唯一方式,但它是C中最常見的,並且這是您在使用"..."
語法時得到的結果。
所以每個字符是一個數字,最後一個字符是零。現在我們使用另一個常見的C語言:零爲假,其他所有值都爲真。所以while (str[i])
等同於:
while (str[i] != 0)
或者更精確地:
while (str[i] != '\0')
這是說:「直到i
指的是字符串末尾的瘋狂囉嗦的方式。「
(不要絕望,其餘是令人驚訝的簡單相比第一道防線。但是,第一行是用C令人難以置信的普遍,所以你需要了解所有正在發生的小事情。)
if (str[i]!='z') //if character is NOT "z" shift character by one
易peasy。如果我們正在尋找在當前字符不是z
......「我們正在尋找」被定義i
。
(c=str[i]+1);
不知道爲什麼有括號在這裏,這有點不尋常,但重點在於採取我們正在查看的角色,並將其添加到數字表示中,並將其分配給c
。由於ASCII和UTF8(兩種非常常見的字符串編碼方式)都將拉丁字母順序排列,所以「a + 1」是「b」。
請注意,這是而不是實施適當的凱撒密碼。在偏移1的傳統凱撒密碼中,「Z」將轉換爲「A」。在此密碼中,「Z」將轉換爲「[」。但我很迂腐。值得了解的是,這個密碼有一些令人驚訝的角落案例。例如,它會將z
和反碼`
編碼爲a
,所以它可以在技術上丟失信息並且不能通過任意ASCII輸入進行反轉(對於UTF8輸入它完全被破壞,所以我們甚至不會在此討論)。沒有什麼大不了的,但作爲程序員,角落案例就是我們的生活,所以最好知道這是什麼投入以及哪些投入不起作用。
(c=str[i]='a'); //if character equals "z" then the output is "a"
這行幾乎肯定是一個錯誤。括號很奇怪,但不是問題。這行代碼的問題是它修改str
,而以前的代碼沒有。幾乎可以肯定此代碼應閱讀:
c = 'a';
噹噹前字符爲z
,輸出應該是a
。
printf("%c" ,c); // Shows encrypted string
這裏的評論有點誤導。它應該說「顯示加密的字符」。
i++;
而且我們將我們的索引向前移動一個字符,然後再次開始該過程。 i++
只是i = i + 1
的C-ism。 (這是稍微比這更復雜,當它出現一個表達式的內部,但在這種情況下,你可能正好與i = i + 1
取代它。)
return 0;
而在Unix風格(其中C是深深地交織在一起) main()
返回零表示「沒有錯誤」。
如果你不知道這段代碼是什麼意思,那麼你可能沒有寫它(或它不工作)。無論如何,請從維基百科創建一個一步一步的算法描述並嘗試在您的代碼中查找這些步驟。教師要求你解釋你的代碼,以便檢查你是否真的寫了它,因爲你必須理解你寫的內容的概念。 –
請不要使用魔術數字,使用「a」和「z」,因爲它會使代碼更清晰,並且更便於攜帶。 –
那麼,我會盡力解釋它: – Twizzler