string text = GetString();
//enters length of argv string into q
//converts string argv[1] into string key
string key = argv[1];
int klen = strlen(key);
int kposition = 0;
//loop through the characters in array "text"
for (int tposition = 0, n = strlen(text); tposition < n; tposition ++)
{
if isupper(key[kposition])
{
key[kposition] = ((key[kposition] - 'A') % klen) + 'A';
}
else if islower(key[kposition])
{
key[kposition] = ((key[kposition] - 'a') % klen) + 'a';
}
//determine if character is alphabetical
if (isalpha(text[tposition]))
{
//encrypt upper case characters
if (isupper(text[tposition]))
{
//modulo magic to loop to beginning of alphabet after 'Z'
text[tposition] = (((text[tposition] - 'A') + key[kposition]) % 26) + 'A';
printf("%c", text[tposition]);
}
//encrypt lower case characters
else
{
//modulo magic to loop to beginning of alphabet after 'z'
text[tposition] = (((text[tposition] - 'a') + key[kposition]) % 26) + 'a';
printf("%c", text[tposition]);
}
}
//if the input isn't alphabetical, then just print the input (spaces)
else
{
printf("%c", text[tposition]);
}
kposition ++;
}
printf("\n");
return 0;
}
我遵循了你的建议并使我的变量更具描述性,这有助于我查看代码。
我仍然没有从我的程序中获得正确的输出,尽管它编译并运行正常。
例如,当我跑: vigenere.c -bacon
然后输入:“在公园见我”, 我得到:“Gxzq mr ni kyr frea”, 而不是正确的答案,这是:“Negh zf av huf pcfx”。
所以大/小写正在工作,空间正在工作。问题在于密钥[kposition]的递增。问题的一部分是我不会很好地模仿模数,因此我不清楚模数运算究竟在做什么(除了它给出了两个数的其余部分)。
如何更好地安排我的关键[kposition]增量器?
答案 0 :(得分:0)
内部for循环,递增j
,似乎完全不合适而且不需要我。
你先做的事情看起来已经很不错了:定义两个迭代索引,一个在明文上(i
),一个在密钥上(j
)。
然后你只需要迭代明文。您使用关键位置i
处的字符加密明文位置j
处的字符。然后将两个迭代索引增加1,将键索引保持在范围内(例如,使用模数)。
所以,基本上你只需要摆脱内部for循环并添加逻辑以使用外部循环增加j
。
关于你的代码:建议将它分开一点:编写一个函数来加密单个字符并在循环中使用它。为变量使用更好的名称。 i
和j
不具有描述性。
答案 1 :(得分:0)
要自行调试,请打印出key[kposition]
您需要限制kposition
kposition = (kposition+1)%klen;
并仅修改字母字符。
将当前密钥作为临时密钥,不要重新添加'A',这不能正确地模数26
key[kposition] = ....;
转到
Tkey = ((key[kposition] - 'a') );
或
Tkey = ((key[kposition] - 'A') );
你没有修改klen,也没有更新密钥。将其他键[kposition]更改为Tkey
#include <stdio.h>
#include <string.h>
int main( int argc, char ** argv)
{
char text[] = "Meet me at the park";
char * key = "bacon";
//enters length of argv string into q
//converts string argv[1] into string key
//string key = argv[1];
int klen = strlen( key);
int kposition = 0;
//loop through the characters in array "text"
for (int tposition = 0, n = strlen( text); tposition < n; tposition++)
{
unsigned Tkey = 0;
if( isupper(key[kposition]) )
{
Tkey = ((key[kposition] - 'A') );
}
else if( islower(key[kposition]) )
{
Tkey = ((key[kposition] - 'a') );
}
//determine if character is alphabetical
if (isalpha(text[tposition]))
{
//encrypt upper case characters
if (isupper(text[tposition]))
{
//modulo magic to loop to beginning of alphabet after 'Z'
text[tposition] = (((text[tposition] - 'A') + Tkey) % 26) + 'A';
kposition = (kposition + 1) % klen;
printf("%c", text[tposition]);
}
//encrypt lower case characters
else
{
//modulo magic to loop to beginning of alphabet after 'z'
text[tposition] = (((text[tposition] - 'a') + Tkey) % 26) + 'a';
kposition = (kposition + 1) % klen;
printf("%c", text[tposition]);
}
}
//if the input isn't alphabetical, then just print the input (spaces)
else
{
printf("%c", text[tposition]);
}
}
printf("\n");
return 0;
}