Vigenere正在加密消息,例如,如果密钥为“hello”且消息为hello,则加密文本现在为“eipsv”时应为“hello”。
我真的很感激有关修复此错误的任何提示。
string message = GetString();
int m = strlen(message);
int i = 0;
if(isalpha(message[i]))
{
for(int j = 0; j < n; i++)
{
key[j] = tolower(key[j]) - 97;
j++;
for (i = 0; i < m; i++)
{
char c = message[i];
if (islower(c))
{
c = (((c - 'a' + key[j%n])%26) +'a');
j++;
printf("%c", c);
}
if (isupper (c))
{
c = (((c - 'A' + key[j%n])%26) +'A');
j++;
printf("%c", c);
}
else if (!isupper(c) && !islower(c))
{
printf("%c", c);
j++;
}
}
}
}
printf("\n");
}
答案 0 :(得分:0)
使用关键字&#34; hello&#34;会对你的信息进行编码&#34;你好&#34;如下:
h -> (shift 7) -> o
e -> (shift 4) -> i
l -> (shift 11) -> w
l -> (shift 11) -> w
0 -> (shift 14) -> c
所以,结果应该是&#34; oiwwc&#34;。
答案 1 :(得分:0)
好的,有一些变化:
将键转换为0到25的第一个循环应该在与编码循环不同的循环中。转换键,然后转到编码循环。
在编码循环中,您需要两个增量器,“i”和“j”,这两个增量器需要在FOR(...; ...; ...)行中重新初始化为0。您不能重复使用密钥转换循环中的“j”,因为它超出了范围。
在编码循环中从ELSE IF语句中删除printf()行之后的j ++。如果字母未编码,则不增加“j”。
顺便说一下,一旦你更新你的程序并通过check50运行它,你会发现几个错误检查错误,因为你有一些错误条件来检查我在你当前的代码中没有看到。但是,它应该通过上述更改正确编码。