【发布时间】:2017-09-18 11:43:39
【问题描述】:
任务:凯撒算法(密码 (c))通过密钥 (k) 位置“旋转”每个字母来加密消息。
实现:ci = (pi+k)mod26 其中 ci 是密码,pi 是明文,k 是密钥。
我的伪代码:
- 从命令行参数获取密钥。
- 将键 (k) 转换为整数。
- 提示用户输入纯文本 (pi)
- 对于每个纯文本字符,保留大小写(在 C 中使用 isalpha、isupper 和 islower 函数。
- 最后按键转换明文字符,例如 - “回家!” --- “Hp Ipnf!” (如果键 k = 1,并保留字母的大写/小写,! 保持为 !)。 ** 我正在为此苦苦挣扎。
- 打印密文。
int main (int argc, string argv[]) //get key from command line argument
{
if (argc != 2 || atoi(argv[1]) < 0)
{
printf ("print valid key");
return 1;
}
int k = atoi(argv[1]);
string p = get_string(); //prompt for plaintext
for (int i=0, n = strlen(p); i < n; i++)
{ if (isalpha('p'))
{
if (isupper('p'))
{
printf ("%c", p[i]);
}
if (islower('p'))
{
printf ("%c", p[i]);
}
}
}
c[i]=(p[i]+k)%26;
printf ("%c", c[i]);
}
【问题讨论】:
-
这里有问题吗?
-
刚刚编辑了我的问题。正如我在伪代码中提到的那样,我正在努力改变字母。
-
什么是
c?它没有在这个范围内声明。您的想法是正确的,但是当您% 26最终得到一个介于 0 和 25 之间的数字时,这些大多数是不可打印的 ASCII 字符,您需要将'a'或'A'添加回它以使它们在字母表中. -
isalpha('p')将始终返回 true,因为 p 是一个字母。也许您的意思是isalpha(p[i])。 -
谢谢!我正在尝试打印 ASCII 字符,我应该添加“a”还是“A”来打印字母?
标签: encryption cs50 caesar-cipher