我试图制作一个程序,即使用Vigenere的密码。每3个字母都错了。有人可以给我一个暗示吗?谢谢你的帮助。
#include <stdio.h>
#include <cs50.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
int main(int argc, string argv[])
{
int n = 0;
int j = 0;
int p;
int l;
int x = 0;
if(argc != 2)
{
printf("missing command-line argument\n");
return 1;
} else
{
printf("plaintext: ");
}
string text = get_string();
string key = (argv[1]);
printf("ciphertext: ");
for (j = 0, x = 0, n = strlen(text); j < n; j++)
{
p = (((text[j] - 65) + ((key[x] - 65) % strlen(key))) % 26) + 65;
l = (((text[j] - 97) + ((key[x] - 97) % strlen(key))) % 26) + 97;
if(isalpha(text[j]))
{
if( isupper (text[j]))
{
printf("%c", p);
x++;
}
if( islower (text[j]))
{
printf("%c", l);
x++;
}
}else
{
printf("%c", text[j]);
}
if(x == strlen(key))
{
x = 0;
}
}
printf("\n");
return 0;
}
如果int p,int l错误或者是另一个问题,我无法判断。
听取是输入/输出的例子
:)使用“a”作为关键字将“a”加密为“a”
:(使用“baz”作为关键字将“barfoo”加密为“caqgon” 预期输出,但不是“密文:casgop \ n”
:(使用“BaZ”作为关键字将“BaRFoo”加密为“CaQGon” 预期输出,但不是“密文:CaSGoo \ n”
:(使用“BAZ”作为关键字将“BARFOO”加密为“CAQGON” 预期输出,但不是“密文:CASGOP \ n”
:(使用“baz”作为关键字将“世界!$?”加密为“xoqmd!$?” 预期输出,但不是“密文:xosmd!$?\ n”
:(加密“世界,打个招呼!”作为“xoqmd,rby gflkp!”使用“baz”作为关键字 预期输出,但不是“密文:xosmd,tby iflmp!\ n”
答案 0 :(得分:0)
查看密码的维基百科描述,打破数学,你有17(R)+ 25(Z)mod 26,这是16(Q)...所以基本上用Z加密任何字母会得到你R之前的字母是Q.
但是你的代码没有做那些数学 - 它在错误的地方有一个虚假的“%strlen(key)”,这就是为什么你认为它应该是一个S.你想要在{{{ 1}}喜欢这样,因此你可以抛弃变量key
x
另外,你会注意到我更换了65&amp; 97使用字符使代码更具可读性。