我正在研究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;
}
}
答案 0 :(得分:1)
代码存在许多正确性和风格问题。
循环变量m_inp
未初始化。
unsigned char
不太可能等于EOF
。 EOF
的值为-1。循环永远不会完成(除非你在非常奇怪的架构上)。
传统的凯撒密码按字母顺序运行,而不是整个ASCII字符集。
使用更“风格正确”的C将使其他程序员更容易阅读您的代码。这些是主观的。
名称m_inp
是短循环中循环变量的不良名称。请改用i
。
更容易阅读ptr[i]
而不是*(ptr + i)
,即使它们在C中完全相同。
将输入标记为const unsigned char *
会使其更明显地未被修改。
使用int
代替char
作为偏移量。
传统上,功能输出位于左侧,输入位于右侧。然而,这并不重要。
以下是修订示例。它采用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);
}