gpt4 book ai didi

c - cs50 中的维吉尼亚密码

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

我正在通过在线类(class)教我如何编码。我对此很陌生,并且一直在慢慢地完成这门类(class)。我遇到了 vingenere 密码的问题。它不会在整个输入中迭代 key 。

编辑:键应该迭代用户输入,当到达键末尾时,循环返回并重新开始。该键还应该跳过任何特殊字符(!@#“”等)

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

int main (int argc, string argv[])
{
if(argc !=2)
{
printf("please put in command line argument: example - ./vigenere command\n");
return 1;
}
string key = argv[1];
int keylength = strlen(key);
for (int i=0;i<keylength; i++)
{
if(!isalpha(key[i]))
{
printf("please make sure command is letter only. Please no numbers or special characters!\n");
return 1;
}
}
string input = GetString();

for (int i=0, k=0; i<keylength; i++)
{
if(isalpha(input[i]))
{
if(isupper(input[i]))
{
input[i]=((input[i]-'A')+(key[k%keylength]))%26+'A';
}
else
{
if(islower(input[i]))
{
input[i]=((input[i]-'a')+(key[k%keylength]))%26+'a';
}
}
}
}
printf("%s\n",input);
return 0;
}

我知道字符串不正常,但它包含在标题中以帮助新学生。我想随着类(class)的进展我们会学到更多。

最佳答案

您没有更改 for 循环中的 k。事实上,我认为你根本不需要 k 。并且您的循环仅迭代 key 的长度,而不是 input 的长度。

int inputlength = strlen(input);
for (int i = 0; i < inputlength; ++i) {
if (isupper(input[i]))
input[i] = ((input[i]-'A') + (key[i%keylength])) % 26 + 'A';
/* ... ^ Use i here */
}

关于当按键为b且输入为A时,必须调整按键的问题。

input[i] = ((input[i]-'A') + (key[i%keylength]-'a')) % 26 + 'A';

要跳过输入特殊字符,

int inputlength = strlen(input);
for (int i = 0, k = 0; i < inputlength; ++i) {
if (isupper(input[i]))
input[i] = ((input[i]-'A') + (key[(k++)%keylength])) % 26 + 'A';
/* ... ^^^ */
else if (islower(input[i]))
input[i] = ((input[i]-'a') + (key[(k++)%keylength])) % 26 + 'a';
}

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

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