Caesar Cipher函数使用unsigned char?

时间:2013-03-03 19:42:05

标签: c

我正在研究Caesar函数,它给出输入和偏移量,返回输出。我不确定我是否这样做。我在这做错了什么?任何帮助表示赞赏。 如果有人能解释我如何使用未签名的字符。

void encrypt(unsigned char* message_input, char off, unsigned char* message_output) {

    int m_inp;

    while(*(message_input+ m_inp)!=EOF)
    {
        *(message_output+ m_inp) = (*((unsigned char*)input + m_inp) + offset )%256;
    }

}

2 个答案:

答案 0 :(得分:1)

代码存在许多正确性和风格问题。

正确性问题

  1. 循环变量m_inp未初始化。

  2. unsigned char不太可能等于EOFEOF的值为-1。循环永远不会完成(除非你在非常奇怪的架构上)。

  3. 传统的凯撒密码按字母顺序运行,而不是整个ASCII字符集。

  4. 文体问题

    使用更“风格正确”的C将使其他程序员更容易阅读您的代码。这些是主观的。

    1. 名称m_inp是短循环中循环变量的不良名称。请改用i

    2. 更容易阅读ptr[i]而不是*(ptr + i),即使它们在C中完全相同。

    3. 将输入标记为const unsigned char *会使其更明显地未被修改。

    4. 使用int代替char作为偏移量。

    5. 传统上,功能输出位于左侧,输入位于右侧。然而,这并不重要。

    6. 修订代码

      以下是修订示例。它采用NUL终止的字符串,并将Caesar编码/解码版本写入输出缓冲区。这就是我编写函数的方式,不一定是你编写函数的方式:

      void caesar(char *output, const char *input, int shift)
      {
          int i;
          for (i = 0; input[i]; i++) {
              if (input[i] >= 'a' && input[i] <= 'z')
                  output[i] = (input[i] - 'a' + shift) % 26 + 'a';
              else if (input[i] >= 'A' && input[i] <= 'Z')
                  output[i] = (input[i] - 'A' + shift) % 26 + 'A';
              else
                  output[i] = input[i];
          }
          output[i] = '\0';
      }
      

      请注意,Caesar加密和解密实际上是相同的操作,只是具有不同的移位值。因此,如果您使用3的移位进行加密,则可以使用-3(或等效地,23)进行解密。

      另请注意,您可以将unsigned char替换为char,反之亦然,一切都将完全相同(尽管您需要投射输入)。

答案 1 :(得分:0)

你写的代码有很多错误

1)您尚未初始化m_inp,但是您正在引用(message_output + m_inp)

2)您正在检查EOF的输入字符串,这没有任何意义。

请看一下这段代码,它是一个更好的caesar密码实现

#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);
}