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);

}

出力:

Hell

XORキーの番号(この場合はASCII'w')に対応する文字を見つけた後、すべてをカットするのはなぜですか?数理論理学では、N^N=0そして0^N=N、そうではありませんか?

4

3 に答える 3

56

'o'はASCIIコード111であり、111と111をXORすると、0 、、が生成さNULれ、文字列が終了します。これが発生すると(最初のループでも、ループを介して毎回評価しているため)、strlen文字列がはるかに短くなり、ループが停止することが報告されます。

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

于 2012-05-01T00:36:41.450 に答える
10

これは、数値をそれ自体で排他的論理和するとゼロになり、strlenがゼロを見ると、それが文字列の終わりであると見なすためです。

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

于 2012-05-01T00:37:25.230 に答える
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);

}
于 2012-05-01T09:02:19.453 に答える