2016-04-09 86 views
-2

任務是加密句子:「我的氣墊船充滿了鰻魚。」 由於其他職責,我錯過了鍛鍊班;) 無論如何,我來到了我在互聯網上發現的sniplets和一點點實驗的結果。它如下:基本凱撒碼;加密字符串。請解釋我做了什麼: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; 
} 

我的問題是我不知道我真的做了什麼。有人可以解釋我的代碼嗎? :D

首先介紹整數i = 0 然後是一串字符 和變量c,它也是一個字符。 雖然字符串中還有字符,但如果它不等於z ,則加1,否則c等於a。所以z = a 但我真的不知道爲什麼它需要我從一個更復雜的凱撒代碼複製我++。就是這樣了。

+3

如果你不知道這段代碼是什麼意思,那麼你可能沒有寫它(或它不工作)。無論如何,請從維基百科創建一個一步一步的算法描述並嘗試在您的代碼中查找這些步驟。教師要求你解釋你的代碼,以便檢查你是否真的寫了它,因爲你必須理解你寫的內容的概念。 –

+0

請不要使用魔術數字,使用「a」和「z」,因爲它會使代碼更清晰,並且更便於攜帶。 –

+0

那麼,我會盡力解釋它: – Twizzler

回答

0
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()返回零表示「沒有錯誤」。

+0

thx男人,這種方式比我預期的更詳細,非常感謝您的時間! A +努力:D我編輯它沒有括號,並取代c ='a';所以也要感謝。 – Twizzler

0

基本上,發生的事情是它訪問while循環中的每個字母並被引用,因爲使用了str[i]。然後,如果該字母不是z,則它將字母向上移動一個字母,因此abc返回bcd。那麼,如果這個字母是z,它就變成了一個。

可以稍微修改程序,通過改變str[i]+1 -1和開關