c语言中异或加密出现中午乱码问题

int main(void)
{

int i;
unsigned char Str[] = { 2,  33,  45,  50,  13,  18,  50,};
char key[] = { "This_is_the_keyThis_is_the_keykey!!"};
size_t len = strlen(Str);

for (i = 0; i < len; i++)
{
    Str[i] ^=key[i];
}
Str[6] = 0;

printf("%s", Str);
return 0;

}
为什么这段代码最后的结果会出现中文乱码?望指教

你不是加密了吗?加密之后出现中文乱码很正常吧

【以下回答由 GPT 生成】

这段代码最后出现中文乱码的原因是因为key数组的长度不够长,导致在进行异或运算时可能会出现越界访问的情况,从而改变了Str数组中的内容,导致输出结果不正确。

要解决这个问题,可以采取以下步骤:

  1. 首先,确保key数组的长度足够长,长度应该大于等于Str数组的长度。可以使用字符串常量的形式来定义key数组,以确保长度满足要求。
  2. 将key数组的类型从char数组改为unsigned char数组,以保证与Str数组的类型一致。
  3. 在进行异或运算之前,先将key数组的每个字符转换为unsigned char类型,以保证进行异或运算时不会引起类型错误或截断。
  4. 在进行异或运算时,如果key数组的长度小于Str数组的长度,可以使用取余操作,使循环使用key数组的内容,直至完成对Str数组的操作。
  5. 最后,将Str数组的最后一个元素置为0,以保证在输出字符串时不会出现问题。

修改后的代码如下所示:

#include <stdio.h>
#include <string.h>

int main(void)
{
    int i;
    unsigned char Str[] = { 2,  33,  45,  50,  13,  18,  50 };
    const unsigned char key[] = "This_is_the_keyThis_is_the_keykey!!";
    size_t len = strlen(Str);
    size_t key_len = strlen(key);

    for (i = 0; i < len; i++)
    {
        Str[i] ^= key[i % key_len];
    }
    Str[len] = '\0';

    printf("%s", Str);
    return 0;
}

通过以上修改,代码应该能够正确执行,并输出正确的结果。如果问题仍然存在,请确认是不是其他部分的代码或环境导致的问题,并及时更正。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

都是加密了啊,所以是乱码,原文肯定不乱。
还有你的Str字符数组最末尾要加上结尾符'\0',不然会出问题。