我一直在研究一个问题集的凯撒密码问题,但遇到了一个小问题。 每当密码值变得大于“z”的 ascii 值时,我希望它反弹回“a”,但我不知道该怎么做。 这是代码:
#include <cs50.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, string argv[])
{
if(argc !=2 && !isdigit(argv[1]))
{
return 1;
}
//convert input to int and get the string
int k = atoi(argv[1]);
k=k%26;
//printf("%d" ,k);
//get he text
char *s;
s=GetString();
int i, n=strlen(s);
//checking each character
for(i=0;i<n;i++)
{
if(s[i]==' ')
{
s[i]=' ';
}
else
{
s[i]=s[i]+k;
}
printf("%c" ,s[i]);
}
}
这是一个非常基本的代码。任何帮助将不胜感激。
附注这是 key 4 的示例。
input- Vinay Dawani
output- Zmre} He{erm
最佳答案
假设使用的代码集不是EBCDIC (字母字符之间有非字母字符),则拉丁字母表的字母(不带重音的 a-z)将被编码为所有公共(public)代码集中的连续代码点。如果您知道如何旋转,字母表的旋转就会很简单。
基本上,您将每个字母转换为距字母 a
或 A
(取决于大小写)的偏移量 0..25,添加编码 key ,获取结果模 26,然后添加起始字母(a
或 A
)。请注意,算术以 int
形式进行,但结果被分配回(可能有符号的)char
。
#include <cs50.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, string argv[])
{
if (argc != 2 || !isdigit((unsigned char)argv[1][0]))
{
fprintf(stderr, "Usage: %s shift\n", argv[0]);
return 1;
}
// convert input to int and get the string
int k = atoi(argv[1]) % 26;
if (k < 0)
k += 26;
char *s = GetString();
int n = strlen(s);
printf("Original: [%s]\n", s);
// encoding each character
for (int i = 0; i < n; i++)
{
if (isupper((unsigned char)s[i]))
{
s[i] = 'A' + (s[i] - 'A' + k) % 26;
}
else if (islower((unsigned char)s[i]))
{
s[i] = 'a' + (s[i] - 'a' + k) % 26;
}
}
printf("Encrypted: [%s]\n", s);
return 0;
}
运行示例:
$ ./caesar13 3
Caesar's cipher is hardly secure against the lazy dog jumping over the quick brown fox, is it?
Original: [Caesar's cipher is hardly secure against the lazy dog jumping over the quick brown fox, is it?]
Encrypted: [Fdhvdu'v flskhu lv kdugob vhfxuh djdlqvw wkh odcb grj mxpslqj ryhu wkh txlfn eurzq ira, lv lw?]
$ ./caesar50 23
Fdhvdu'v flskhu lv kdugob vhfxuh djdlqvw wkh odcb grj mxpslqj ryhu wkh txlfn eurzq ira, lv lw?
Original: [Fdhvdu'v flskhu lv kdugob vhfxuh djdlqvw wkh odcb grj mxpslqj ryhu wkh txlfn eurzq ira, lv lw?]
Encrypted: [Caesar's cipher is hardly secure against the lazy dog jumping over the quick brown fox, is it?]
$
CS50 library很容易在线获得。
关于凯撒密码无法正常工作 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38364054/