2012-05-01 53 views
19
#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char greeting[]="\nHello World!\n"; 
    int a; 

    for(int i=0; i<strlen(greeting); i++) 
     greeting[i]^=111; 

    for(int i=0; i<strlen(greeting); i++) 
     greeting[i]^=111; 

    printf("%s\n",greeting);  
    scanf("%d",&a); 

} 

輸出:XORing「Hello World!」截止串

Hell 

爲什麼它切斷一切斑點對應的XOR鍵的編號函後,(在這種情況下,ASCII「W」)?在數學邏輯中,N^N=00^N=N,不是嗎?

+1

[** DEMO **](http://ideone.com/u6ZNf) – qwertymk

+0

這被認爲是簡單的XOR加密,是嗎? – Linuxios

+0

不是作業,我認爲這只是一個很好和簡潔的視覺練習。我是這個問題的作者=) – 0x6B6F77616C74

回答

56

由於'o'是ASCII碼111,並且與111異或111會產生0,NUL,並終止您的字符串。一旦發生這種情況(即使在第一次循環中,因爲每次都通過循環評估它),strlen報告字符串要短得多,並且循環停止。

在通過異或之前保存字符串長度將使您免於此。

+6

請注意,爲了解決這個問題,他應該在字符串變異之前保存'strlen'的返回值。 –

+3

@NicolBolas他突變它,然後unmutates它,並在此之後獲得原始字符串,因此證明:http://ideone.com/omgw0 –

+3

+1。請注意,xoring也會影響第一個循環 - 它不會在'o'之後執行。 – asaelr

10

這是因爲當你用自己對數字進行異或時,它變爲零,當strlen看到零時,它認爲它是字符串的末尾。

如果您在第一個循環之前將長度存儲在變量中,然後在第二個循環而不是strlen中使用保存的長度,則程序將生成預期結果。

4

greeting[5]是'o',它是ASCII中的111。 因此,greeting [5]^111將爲零(這將終止您的字符串) 第二個循環中的strlen將返回不同的值。

要解決此問題,請使用變量len來存儲原始strlen。 你會得到你的字符串!

修改:

#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char greeting[]="\nHello World!\n"; 
    int a; 
    int len = strlen(greeting); 

    for(int i=0; i<len; i++) 
     greeting[i]^=111; 

    for(int i=0; i<len; i++) 
     greeting[i]^=111; 

    printf("%s\n",greeting);  
    scanf("%d",&a); 

}