我正在通过在线课程教我如何编码。我对此非常陌生,并且正在慢慢地通过这门课程。我遇到了vingenere密码的问题。它不会通过整个输入迭代密钥。
编辑:密钥应该遍历用户输入,当它到达密钥的末尾时,循环返回并重新开始。密钥也应该跳过任何特殊字符(!@#“”等)
#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;
}
我知道字符串不正常,但它包含在标题中以帮助新学生。我想我们会随着课程的进展而学到更多。
答案 0 :(得分:1)
您未在k
循环中更改for
。事实上,我认为你根本不需要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';
}