【发布时间】:2017-08-13 17:54:41
【问题描述】:
我正在为 Vigenere 密码编写程序。我让程序成功打印密文。但是,我无法循环密钥。因此,如果我的密钥是 'abc' 而我的纯文本是 hello,它应该打印 'hfnlp' 而不是 'hfn'。
#include <stdio.h>
#include <cs50.h>
#include <string.h>
#include <ctype.h>
int main(int argc, string argv[])
{
if(argc != 2)
{
printf("\aError\n");
return 1;
}
else
{
string a = argv[1]; // converts argv[1]
printf("plaintext: ");
string b = get_string(); // takes the plaintext
printf("ciphertext: ");
for(int c = 0, d = strlen(a); c < d; c++)
{
for(int e = 0, f = strlen(b); e < f; e++)
{
if(islower(a[c]))
{
printf("%c\n", b[e] + ( (a[c] - 97) % 26) ); // works for lowercase letters
return 0;
}
else if(isupper(a[i]))
{
printf("%c\n", b[e] + ( (a[c] - 65) % 26) ); // works for uppercase letter
}
else
{
printf("%c", b[e]); // works for non alphabetical inputs
}
if(true)
break;
}
}
printf("\n");
}
}
【问题讨论】:
-
当你到达钥匙的末端时,你必须回到起点。模运算符
%经常用于管理这个,尽管一个简单的条件也可以。您需要一个计数器来单步执行纯文本;您需要一个单独的计数器来多次循环访问密钥(通常,除非纯文本比密钥短)。你也只需要一个循环,而不是两个嵌套循环——它应该单步执行纯文本(代码中的b)。请注意,初始化string a = argv[1];中没有“转换”——您只是将指针复制到更方便的名称。 -
另外,错误信息应该打印到标准错误中,当命令行出现问题时,指示如何使用程序通常比仅仅说“错误”要好。
fprintf(stderr, "Usage: %s key\n", argv[0]);会更好;你甚至可以使用fprintf(stderr, "Usage: %s key < plain-text\n", argv[0]);来指示如何将纯文本输入到程序中。 -
@JonathanLeffler 我删除了 if(true) 语句的代码。但是现在,它打印出错误的密码字母。公式写在代码中。但不是得到“一些”字母更正。它输出错误。 [对不起,如果我的英语有错误]