异或"Hello World!"切断字符串

XORing "Hello World!" cuts off string

本文关键字:字符串 World Hello 异或      更新时间:2023-10-16
#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("%sn",greeting);    
    scanf("%d",&a);
}

输出:

Hell

为什么它会在发现与 XOR 键的数字对应的字母(在本例中为 ASCII 'w')后切断所有内容? 在数理逻辑中,N^N=00^N=N,不是吗?

因为'o'是 ASCII 代码 111,而具有 111 的 XORing 111 产生 0,NUL ,并终止您的字符串。 一旦发生这种情况(即使在第一个循环中,因为您每次通过循环都会对其进行评估),strlen 报告字符串要短得多,并且循环会停止。

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

这是因为

当你用自己或一个数字时,它就变成了零,当strlen看到零时,它认为它是字符串的结尾。

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

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("%sn",greeting);    
    scanf("%d",&a);
}