2012-05-01 6 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); 

} 

出力:「Hello World!」とXORingする文字列をカット

Hell 

は、なぜそれが(この場合は、ASCII「W」)XORキーの番号に対応する文字をスポッティングした後、すべてをカットしていますか?数学的論理では、N^N=00^N=Nですね。

+1

[** DEMO **](http://ideone.com/u6ZNf)これは右、簡単なXOR暗号化することになっている – qwertymk

+0

? – Linuxios

+0

宿題ではない、私は知覚のための単なる良いと簡潔な運動だと思う。私はこの質問の著者です=) – 0x6B6F77616C74

答えて

56

'o'はASCIIコード111であり、111の111の排他的論理和は0,NULとなり、文字列は終了します。これが起こると(最初のループであっても、ループのたびに評価するので)、strlenは文字列がはるかに短く、ループが停止すると報告します。

XORを通過する前に文字列の長さを保存すると、これを避けることができます。

+6

これを修正するには、文字列を変更する前に 'strlen'の戻り値を保存する必要があることに注意してください。 –

+3

@NicolBolas彼はそれを突然変異させてから突然変異させ、その後、元の文字列が得られるので、証明:http://ideone.com/omgw0 –

+3

+1。 xoringが最初のループにも影響することに注意してください - それは 'o'の後にはありません。 – asaelr

10

これは、自分自身でxを数値化するとゼロになり、strlenがゼロになると文字列の終わりだと思うからです。

最初のループの前に変数に長さを格納し、strlenではなく2番目のループでその保存された長さを使用すると、プログラムは期待される結果を生成します。

4

greeting[5]は、ASCIIで111の 'o'です。 したがって、greeting [5]^111はゼロになります(文字列を終了します)。 2番目のループの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); 

}