#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
,不是吗?
答案 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);
}