0

我正在研究一个凯撒函数,它给定输入和偏移量,返回输出。我不确定我是否正在这样做。我在这里做错了什么?任何帮助表示赞赏。另外,如果有人可以向我解释如何使用无符号字符。

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

}
4

2 回答 2

1

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

正确性问题

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

  2. anunsigned char不可能等于EOF。的值为EOF-1。循环永远不会结束(除非你在一个非常奇怪的架构上)。

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

文体问题

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

  1. 该名称m_inp对于短循环中的循环变量来说是一个糟糕的名称。改为使用i

  2. 它比 更容易阅读,即使它们在 C 中完全等价ptr[i]*(ptr + i)

  3. 将输入标记为const unsigned char *更明显的是它没有被修改。

  4. 使用int而不是char偏移。

  5. 传统上,函数输出在左边,输入在右边。然而,这并不重要。

修改后的代码

这是一个示例修订。它接受一个以 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';
}

注意凯撒加解密其实是同一个操作,只是移位值不同而已。因此,如果您使用 3 的移位进行加密,则可以使用 -3 的移位(或等效的 23)进行解密。

另请注意,您可以替换unsigned charchar或反之亦然,并且一切都将完全相同(尽管您需要转换输入)。

于 2013-03-03T22:10:27.800 回答
0

你写的代码有很多错误

1)你还没有初始化 m_inp ,但你正在推迟(message_output + m_inp)

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

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

#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);
}
于 2013-03-03T19:59:14.323 回答