来自我的caesar.c文件的代码
#include <stdio.h>
#include <cs50.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
int main(int argc, string argv[])
{
// get a string from the user, a non-negative integer.
if (argc != 2 || atoi(argv[0]) < 0)
{
printf("Usage: ./caesar cyphertext\n");
return 1;
}
// create the cyphertext.
int cyphertext = atoi(argv[1]);
// declare plaintext input.
string plaintext = GetString();
// get the plaintext encrypted using the key.
for (int i = 0, n = strlen(plaintext); i < n; i++)
{
if (plaintext[i] > 'A' && plaintext[i] <= 'Z')
{
plaintext[i] = (plaintext[i] - 'A' + cyphertext) % 26;
}
else if (plaintext[i] >= 'a' && plaintext[i] < 'z')
{
plaintext[i] = (plaintext[i] - 'a' + cyphertext) % 26;
}
}
{
// print out the results of the cypher and plaintext.
printf("%s\n", plaintext);
}
return 0;
}
输出
我键入./caesar 13
,然后在下一行输入“hello”一词。
你好然后返回几个小字母和数字的小盒子。我不能
复制并粘贴确切的字符。
编辑:
感谢您的帮助。我按照你的帮助清理了,现在当我运行check50程序时
check50 2014/x/pset2/caesar caesar.c
我收到以下错误:
:( encrypts "BARFOO" as "EDUIRR" using 3 as key
\ expected output, but not "EAUIRR\n"
然而,当我用3键作为键运行BARFOO这个词时,我确实得到输出为 EAUIRR。
答案 0 :(得分:1)
你在凯撒加密中犯了错误。
plaintext[i] = (plaintext[i] - 'A' + cyphertext) % 26;
应该是
plaintext[i] = 'A' + ((plaintext[i] - 'A' + cyphertext) % 26);
和
plaintext[i] = (plaintext[i] - 'a' + cyphertext) % 26;
应该是
plaintext[i] = 'a' + ((plaintext[i] - 'a' + cyphertext) % 26);
说明:
考虑案例明文[i] =&#34; h&#34;。
plaintext[i] - 'a'
生成7.(&#39; h&#39; - &#39; a&#39;)
(plaintext[i] - 'a' + cyphertext) % 26
取20((7 + 13)%26)
该代码为20的字符是控制代码&#34; DC4&#34;它不可打印。
这就是为什么你会在&#34;中看到&#34;带有小写字母和数字的小方框。
您可以通过添加代码&#39; a&#39;来解决此问题。到20岁。