我有以下问题:
我会实现一个大多数工作的停止密码,但是当我到达字母表的末尾时,它超出了字母表,我认为这是由于 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_text
和plain_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。
从逻辑上讲,它是正确的,它会给你正确的输出。
您可以在此处查看相同代码的执行。