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,并且 XORing 111 与 111 产生 0, NUL, 并终止您的字符串。一旦发生这种情况(即使在第一个循环中,因为您每次都在通过循环评估它),strlen报告字符串要短得多,并且循环停止。

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

于 2012-05-01T00:36:41.450 回答
10

这是因为当您将一个数字与自身进行异或时,它变为零,而当 strlen 看到零时,它认为它是字符串的结尾。

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

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

}
于 2012-05-01T09:02:19.453 回答