gpt4 book ai didi

c - 维吉尼亚密码错误输出

转载 作者:行者123 更新时间:2023-11-30 20:36:23 25 4
gpt4 key购买 nike

我必须对维吉尼亚密码进行编程,但我的输出看起来有点不同。

输入: Po treti raz sa ohlasi key : euhwa

输出: TI ANEXC YWZ WU VDLEMP 我得到的: TI ANEDM LHV SK SBSWSS

您能帮我找出为什么它不能正常工作吗?

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

char* vigenere_encrypt(const char* key, const char* text)
{
if(key==NULL || text==NULL)
return NULL;

int i,k,t,j=0;
t = strlen(text);
k = strlen(key);

char* copy=(char*)malloc(strlen(text)+1);
char* enc=(char*)malloc(strlen(text)+1);
char* copykey=(char*)malloc(strlen(key)+1);

for (i=0;i<k;i++)
{
copykey[i]=toupper(key[i]);
}

for (i=0;i<k;i++)
{
if(!(isalpha(copykey[i])))
{
free(copy);
free(copykey);
free(enc);
return NULL;
}
}

for (i=0;i<=t;i++)
{
copy[i]=toupper(text[i]);
}

for (i=0;i<=t;i++)
{
if (isupper(copy[i]))
{
enc[i]=(copy[i]+copykey[j])%26+'A';
j++;
if (j>k)
j=0;
}
else enc[i]=copy[i];
}

free(copy);
free(copykey);
return enc;
}

int main()
{
char* encrypted;
encrypted = vigenere_encrypt("euhwa","Po treti raz sa ohlasi!");
printf("%s\n",encrypted);
free(encrypted);
}

最佳答案

问题在于你如何处理:

"Hey, i've finished the key, lets bring j back to zero"

现在,代码非常困惑,不是为了双重复制/粘贴(它可能发生),而是因为它可以(并且应该)稍微优化一下..

无论如何,您的问题的解决方案很简单:

jk>=时,您应该将j设置为零。 equal 部分很重要,因为当您达到 key 长度时您希望它为 0。您这样做的方式(仅测试大于)意味着当您到达键的末尾时,您会执行一个使用无效copykey值的额外循环。如果 key 的长度等于 5,您应该在 copykey[4] 处停止,但额外的循环执行 copykey[5] 这是无效的..(不幸的是)它不会段错误让你下 hell 。

for (i=0;i<=t;i++)
{
if (isupper(copy[i]))
{
enc[i]=(copy[i]+copykey[j])%26+'A';
j++;
if (j >= k)
j=0;
}
else enc[i]=copy[i];
}

关于c - 维吉尼亚密码错误输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36250607/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com