凯撒密码负数发行

时间:2018-08-26 12:57:31

标签: c negative-number caesar-cipher

我正在尝试编写一个带有参数的凯撒密码程序,将其转换为整数,并以此将字母沿某个方向移动(正数将其向前移动,负数将其向后移动。因此到目前为止,所有程序都适用于所有正数,但不适用于负数。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>


int encrypt(int character, int shift);

int main(int argc, char * argv[]) {

    int shift = atoi(argv[1]);
    if (shift >= 26) {
        shift = ((shift + 26) % 26);
    }

    int character = getchar();

    while (character != EOF) {
        int new_character = encrypt(character, shift);
        putchar(new_character);
        character = getchar();
    }

    return 0;

}

int encrypt(int character, int shift) {
    int ch = character;
    int negShift = shift;

    if (ch >= 'a' && ch <= 'z') {
        ch = ch + shift;
        if (ch > 'z') {
            ch = ch - 'z' + 'a' - 1;
        }
    } else if (ch >= 'A' && ch <= 'Z') {
        ch = ch + shift;
        if (ch > 'Z') {
            ch = ch - 'Z' + 'A' - 1;
        }
    }

    return ch;
}

1 个答案:

答案 0 :(得分:2)

add时,您可以从26ch ch < 'a' or ch <'A'。 考虑下面的示例。

    if(ch < 'a')
     {
      ch  = ch + 26;
     } 

完整代码。

int encrypt(int character, int shift) {
    int ch = character;
    int negShift = shift;

    if (ch >= 'a' && ch <= 'z') {
        ch = ch + shift;
        if (ch > 'z') {
            ch = ch - 'z' + 'a' - 1;
        }

         else if(ch < 'a')
         {
            ch  = ch + 26; //Here
         } 

    } else if (ch >= 'A' && ch <= 'Z') {
        ch = ch + shift;
        if (ch > 'Z') {
            ch = ch - 'Z' + 'A' - 1;
        }

        else if(ch < 'A')
        {
            ch = ch + 26; // Here 
        }

    }

    return ch;
}