异或"Hello World!"切断字符串
XORing "Hello World!" cuts off string
#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=0
和0^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);
}