凯撒密码无法正常工作 C

标签 c cs50 caesar-cipher

我一直在研究一个问题集的凯撒密码问题,但遇到了一个小问题。 每当密码值变得大于“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)代码集中的连续代码点。如果您知道如何旋转,字母表的旋转就会很简单。

基本上,您将每个字母转换为距字母 aA (取决于大小写)的偏移量 0..25,添加编码 key ,获取结果模 26,然后添加起始字母(aA)。请注意,算术以 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/

相关文章:

c++ - 如何检查 AVX intrinsic __m256 的 inf

c - Ubuntu GDB 将设置为 intel

c - 涉及多个进程的矩阵乘法中的共享内存

CS50 IDE clang : error: linker command failed with exit code 1

创建一个 "Mario Style Pyramid"

python - 接收和旋转字符的函数 - Caesar Cipher

c - 基本凯撒法典;加密字符串。请解释我做了什么:D

mysql - 提交查询时出现段错误

使用字符串数组调用整数的 1's, 10' s, 100's... 列

python - 如何解决 Python 中凯撒代码的问题