代码存在许多正确性和风格问题。
正确性问题
循环变量m_inp
未初始化。
anunsigned char
不可能等于EOF
。的值为EOF
-1。循环永远不会结束(除非你在一个非常奇怪的架构上)。
传统的凯撒密码按字母顺序运行,而不是在整个 ASCII 字符集上运行。
文体问题
使用更多“风格正确”的 C 将使其他程序员更容易阅读您的代码。这些都是主观的。
该名称m_inp
对于短循环中的循环变量来说是一个糟糕的名称。改为使用i
。
它比 更容易阅读,即使它们在 C 中完全等价ptr[i]
。*(ptr + i)
将输入标记为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';
}
注意凯撒加解密其实是同一个操作,只是移位值不同而已。因此,如果您使用 3 的移位进行加密,则可以使用 -3 的移位(或等效的 23)进行解密。
另请注意,您可以替换unsigned char
为char
或反之亦然,并且一切都将完全相同(尽管您需要转换输入)。