已经为此工作了很长一段时间,但似乎没有任何效果。我需要制作一个 Vigenere 密码,它将关键字作为 argy[1] 然后获取一个字符串并使用这两个,执行 Vigenere 密码所做的事情,其中关键字中的字母 A 和 a 对应于 0 的移位并且 z 和 Z 对应于 25 的移位。必须保留大小写(大写和小写),并且不得对字符串中的任何非字母字符进行加密,因此关键字本身中的字母不应该用完,直到下一个字母性格就在那里。这就是基本的破绽...
我将发布我的代码。请不要关注问题背后的实际数学(我可以自己弄清楚那部分),而是关注模数和我的循环的使用。现在我只处理字符串中的字符是否为小写。
该程序编译并似乎可以使用单个字母组合,而使用 argv[1] 的 'b' 和字符串 'a' 输出是 'b'。但是,两个字母关键字会产生更多的加密字母,然后是字符串中的字母(我该如何解决这个问题)。另外,当关键字用完所有字母时,我很难让关键字环绕到第一个字母(如果字符串中的字母字符比关键字多)。
#include <stdio.h>
#include <cs50.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, string argv[])
{
int a = argc;
if (a != 2)
{
return 1;
}
string b = argv [1];
int c = strlen(b);
string m;
for (int d = 0; d < c; d++)
{
if ( isdigit(b[d]) || ispunct(b[d]) || isspace(b[d]) )
{
return 1;
}
}
m = GetString();
for (int i = 0, n = strlen(m); i < n; i++)
{
if (islower(m[i]))
{
for (int j = 0; j <= c; j++)
{
if (j > c)
{
j = 1;
printf("%c", ((m[i]+(b[j]))%26)+85);
}
else
{
printf("%c", ((m[i]+(b[j]))%26)+85);
}
}
}
}
}