凯撒的密码

时间:2011-12-11 10:34:38

标签: c string

#include <stdio.h>

void caesar (char cipher[], int shift);

int main () {

char cipher[50];
int shift;

  printf("Enter text to be encrypted IN CAPITAL LETTERS ONLY: ");
  scanf("%s", cipher);

  printf("How many shifts do you prefer? 1-10 only: ");
  scanf("%d", &shift);

  caesar (cipher, shift);

  return 0;
}

void caesar (char cipher[], int shift) {
  int i = 0;

  while (cipher[i] != '\0') {
    if ((cipher[i] += shift) >= 65 && (cipher[i] += shift) <= 90) {
      cipher[i] += (shift);
    } else {
      cipher[i] += (shift - 25); 
    }
    i++;
  }
  printf("%s", cipher);
}

我开始获得加密输出,但我担心我的陈述有问题。

例如:

  • 输入:ABCD,1班
  • 输出:DEFG &lt; =实际上是3班。

7 个答案:

答案 0 :(得分:9)

更改

if ((cipher[i] += shift) >= 65 && (cipher[i] += shift) <= 90) ...

if ((cipher[i] + shift) >= 65 && (cipher[i] + shift) <= 90) ...

因为+=修改了cipher[i]

答案 1 :(得分:5)

(我是通过http://codereview.stackexchange.com来到这里的,所以我还戴着代码审查帽。)

使用操作字母的代码,如果它使用源中的实际字母而不是数字代码,我会发现它更容易理解。 所以我建议改变

  cipher[i] += (shift - 25); 

类似

  cipher[i] += (shift - ('Z' - 'A')); 

大多数做Caesar密码的人只转换 字母,并通过标点符号,数字,空格等不变。 您可以考虑包括标准字符库

#include <ctype.h>

并使用函数isalpha(),islower(),isupper() - 特别是,更改

if ((cipher[i]) >= 'A' && (cipher[i]) <= 'Z') {

类似

if (isupper(cipher[i])) {

答案 2 :(得分:3)

void caesar (char cipher[], int shift) {
  int i = 0;

  while (cipher[i] != '\0') {
    if (cipher[i] >= 'A' && cipher[i]<='Z') {
        char newletter = cipher[i] - 'A';
        newletter += shift;
        newletter = newletter % 26;
        cipher[i] = newletter + 'A';
    }
    i++;
  }
  printf("%s", cipher);
}

这会忽略任何不是大写字母的内容。

如果字母的代码为0-25,那么进行转换将非常容易,因为我们可以使用剩余的26来保存条件。 这就是我所做的,我减去'A',这样A字母将为0,然后我添加移位并计算余数,这样如果你将'1'加1,你将获得'A'再一次等等。 最后我不得不再次添加'A',因为在ASCII中,'A'实际上不是0。

答案 3 :(得分:2)

尝试替换

if ((cipher[i] += shift) >= 65 && (cipher[i] += shift) <= 90) {
  cipher[i] += (shift);
 } else {
  cipher[i] += (shift - 25); 
 }

if ((cipher[i] += shift) >= 65 && (cipher[i] = shift) <= 90) {
 // do nothing
 } else {
  cipher[i] = 'A' + ('Z' - cipher[i]) -1; 
 }

使用“+ =”将在评估时修改值。 在您的代码中对此进行了3次评估,这就是为什么它会给出3个班次!

答案 4 :(得分:2)

小工作版,除负值外没有换档范围:

#include <stdio.h>

void caesar (char cipher[], int shift);

int main () {

  char cipher[50];
  int shift;

  printf("Plaintext (Caps only): ");
  scanf("%s", cipher);

  printf("Shift: ");
  scanf("%d", &shift);

  caesar (cipher, shift);

  return 0;
}

void caesar (char cipher[], int shift) {

  for(int i=0; cipher[i] != '\0'; i++)
    cipher[i] = 65 + (cipher[i]-65+shift)%26;
  printf("Cipher text: %s\n", cipher);
}

答案 5 :(得分:1)

我修改了LtWorf以匹配我当前的项目。

换档范围:-9~ + 9

void caesar(char cipher[], int shift) {
  int i = 0;

  while (cipher[i] != '\0') {
    if (cipher[i] >= 'A' && cipher[i]<='Z') {
        char newletter = cipher[i] - 'A' + 26;
        newletter += shift;
        newletter = newletter % 26;
        cipher[i] = newletter + 'A';
    } else if (cipher[i] >= '0' && cipher[i]<='9') {
        char newletter = cipher[i] - '0' + 10;
        newletter += shift;
        newletter = newletter % 10;
        cipher[i] = newletter + '0';
    }
    i++;
  }
  printf("%s\n", cipher);
}

答案 6 :(得分:1)

C ++的Caesar Cipher Code

#include<iostream>
#include<cctype>
using namespace std;

char cipher(char c, int k)
{
    if(isupper(c))
        return char( 'A' + (c - 'A' + k ) % 26);

    else if(islower(c))
        return char( 'a' + (c - 'a' + k ) % 26);

    else
        return c;
}

int main()
{
    int k;
    string str;
    cin>>str>>k;
    int l = str.size();

    for(int i=0; i<l; i++)
        cout<<cipher(str[i], k);
}