【发布时间】:2016-10-05 15:21:50
【问题描述】:
我一直在研究 cs50 pset2,我认为在研究了几天之后我已经掌握了 vigenere 密码。此代码旨在采用用户给出的字母参数(argv[]),并将其用作密钥,通过其在字母索引中的编号来加密用户(字符串)给出的短语。例如,如果您给出参数 'abc' 和字符串 'cat',那么输出应该是 'cbv'(a 移动 0,b 移动 1,c 移动 2) 参数也应该环绕,这样如果字符串是更长的时间,参数将换行到它的第一个字符并继续直到字符串结束。
这是我的代码:
#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main(int argc, string argv[])
{
if(argc != 2)
{
printf("Try again\n");
return 1;
}
string k = (argv[1]);
int klen = strlen(k);
for(int x = 0; x < klen; x++)
{
if(isalpha(k[x]))
{
if(isupper(k[x]))
{
k[x] = tolower(k[x]);
}
k[x] -= 'a';
}
else
{
printf("Try again\n");
return 1;
}
}
string code = GetString();
int clen = strlen(code);
for(int a = 0, b = 0; a < clen; a++)
{
if(isalpha(code[a]))
{
int key = k[b%klen];
if(isupper(code[a]))
{
printf("%c", (((code[a] - 'A') + key)%26) + 'A');
b++;
}
else
{
printf("%c", (((code[a] - 'a') + key)%26) + 'a');
b++;
}
}
else
{
printf("%c", code[a]);
}
}
printf("\n");
}
代码似乎适用于键 +1 的长度。 例如, 我输入了一个参数'aaaa'
然后输入一串'bbbbb' 并正确接收“bbbbb”。
但是,如果我输入相同的 'aaaa'
然后输入一个长于键+1 'bbbbbbb'的字符串 我收到'bbbbbNN'
我认为我的操作顺序有问题,但尝试移动括号无济于事。我希望有人能指出我正确的方向,为什么我的密钥没有正确包装。
【问题讨论】:
-
我无法为您的输入
aaaa和bbbbbbb复制此内容,尽管我没有使用任何string类型,只是分配char *k = argv[1];和char *code = argv[2];其余的内容与您发布的一样。我建议你打印出int klen = strlen(k);的值 -
我认为你的第三个 printf 应该是
printf("%c", (((code[a] - 'a') + (k[b%klen] - 'A'))%26) + 'a');。 -
鲍勃,谢谢。这绝对是问题的一部分。我已经更新了我的代码,但现在我得到的是
bbbbbhh而不是bbbbbNN我似乎仍然无法将密钥包裹在代码周围 -
该示例没有任何大写字母作为键,所以我没有得到错误的输出。但我还是要问:
klen对应的键aaaa的值是多少? -
klen的值是4与该输入