基本上我必须创建一个caesar密码,它只用一个字母“int”来替换每个字母。这需要2个命令行参数:'。/ caesar'和'k',由用户给出。它工作正常;但有一个问题:
它使用3作为正确的密钥将“BARFOO”加密为“EDUIRR” 使用4作为正确的密钥将“BaRFoo”加密为“FeVJss”
但它没有使用65作为密钥将“barfoo”加密为“onesbb”,它将其加密为“oonneess | bb | bb”。
请注意标点符号;大写等等。
在这里查看问题?它也可以用于其他随机词;它重复了一些信件。帮助我....
PS:我对编程非常陌生,你可以在我的代码中看到,所以请尝试用英语解释!
#include <stdio.h>
#include <cs50.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, string argv[])
{
string s;
//int d;
int c;
int a;
if(argc != 2)
{
printf("Please run with a command line argument.");
return 1;
}
else
{
s = GetString();
}
int k = atoi(argv[1]);
for(int i = 0; i < strlen(s); i++)
{
a = s[i];
if(a<'A'||a>'z')
{
printf(" ");
}
else
{
if(a>='A'&&a<='Z')
{
c = a+k;
while(c>'Z')
{
c = 'A'+(c-'Z')-1;
printf("%c", c);
}
if(c<='Z')
{
printf("%c", c);
}
}
else if(a>-'a'&&a<='z')
{
c = a+k;
while(c>'z')
{
c = 'a'+(c-'z')-1;
printf("%c", c);
}
if(c<='z')
{
printf("%c", c);
}
}
}
}
printf("\n");
}
答案 0 :(得分:2)
您可以尝试使用k%26
因为它应该包裹字母表的字符。
这应该可以解决你的问题。
答案 1 :(得分:1)
你应该这样试试。以大写字母为例。首先从字母“A&#39;”中获取索引。
index = a - 'A';
然后在变量k
中添加值,并在除以26时得到余数。
modified_index = ( index + k ) % 26;
现在要获得所需的字母,只需添加'A'
。
c = 'A' + modified_index;
只有添加k%26
才会有帮助,因为'z'
的增量1会变为{
,这是错误的。
此外,如果您只是在k
中添加带有变量a
表示的字母的值,它可能会超出Joulin所提到的ASCII字符的限制。