如何实现保持在 C 字母表范围内的停止密码



我有以下问题:

我会实现一个大多数工作的停止密码,但是当我到达字母表的末尾时,它超出了字母表,我认为这是由于 ascii 值造成的。

例如: 如果我插入一个k并使用密钥35我会得到一个H但它应该以小写字母环绕并产生一个b. 它有时还会产生标点符号或其他类似<的东西,这是我不想要的。

负责加密的代码是

encripted_text = (plain_text + key - 97)%26 +97;

我是否错过了一些东西来让它环绕并只停留在字母表中。

程序运行示例:

char plain_text = 'k';
int k = 35;
char encripted_text = '';
encripted_text = (plain_text + key - 97)%26 + 97;
printf("%c", encripted_text);

感谢您的帮助。

假设encripted_textplain_text都是字符变量(1 字节),您必须确定一个公式,以确保即使结果环绕有效的输出字符也能计算出来。

怎么做?这取决于什么是有效的字符!在某些情况下,您可以简单地依赖 ASCII 代码中字符的映射方式,但我想建议您一个通用解决方案,您将能够根据您的特定要求进行翻译。

此通用解决方案包括使用接受的字母表定义数组,并将输入字符转换为其中的字符之一。

例如:

char alphabet[] = { 'a','A','b','B','c','C' }; //just an example
char input_char = 'k';
int key = 35;
char encripted_char = '';
encripted_char = alphabet[(input_char + key - 97)%(sizeof(alphabet))];
printf("%c", encripted_char );

总结:该公式不直接计算加密的字符,而是使用运算符规范化的接受字母数组%索引。

我得到了具有相同逻辑@nad34的正确输出。事实上,我正确地将输出为"k"的"t"。它不应该也不会给出"b"。 您的代码具有正确的逻辑,除了一些轻微的错误。

我不知道你为什么在这里使用字符串,但既然你无论如何都是,这个 ->char plain_text[] = 'k';应该改为char plain_text[] = "k";==>请注意双引号

int k = 35;应该是int key = 35;的,因为你使用了变量名key而不是k。

从逻辑上讲,它是正确的,它会给你正确的输出。

您可以在此处查看相同代码的执行。

最新更新