XORing“Hello World!”切断字符串

时间:2012-05-01 00:34:14

标签: c++ c xor

#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=00^N=N,不是吗?

3 个答案:

答案 0 :(得分:56)

因为'o'是ASCII码111,而带有111的XORing 111产生0,NUL,并终止你的字符串。一旦发生这种情况(即使在第一个循环中,因为每次循环都在评估它),strlen报告字符串更短,循环停止。

在通过XOR之前保存字符串长度将使您免于此。

答案 1 :(得分:10)

这是因为当你自己编号时,它变为零,当strlen看到零时,它认为它是字符串的结尾。

如果在第一个循环之前将长度存储在变量中,然后在第二个循环中使用保存的长度而不是strlen,则程序将产生预期的结果。

答案 2 :(得分:4)

greeting[5]是'o',ASCII为111。 因此问候[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);

}