首页 > 解决方案 > 我正在尝试对字符 z(ASCII 122)执行凯撒移位。如何给它“更多空间”以防止它溢出超过 127?

问题描述

在 CS50 2019 Caesar 作业中,我应该对字符执行给定数量的字母 ( key) 的 Caesar 移位。

为此,我将 的值添加key到每个字母,如下所示:

for each character in plaintext:
    plaintext[character] += key

由于我想z循环回a,然后我写道:

while (ciphered_character > 122)
{
    ciphered_character -= 26;
}

plaintext使用ofz和 a要添加key26原因运行程序(由 表示)。这会导致溢出(我假设超过 127)并在循环开始之前变为负数。这会产生垃圾输出。26z122plaintext[character]while

我知道我可以事先检查潜在的溢出并26先减去,但这会使我的代码复杂化。我可以给变量“更多空间”以防止它溢出吗?

我是否使用不同的数据类型?这里的最佳做法是什么?

标签: carrayscryptographycs50caesar-cipher

解决方案


如果您只关心小写,那么这对您有用:

for each character in plaintext:
   plaintext[character] = (plaintext[character] - 'a' + key) % 26 + 'a'

减去 'a' 得到 0-25 的值,然后添加键。如果发生溢出,模数将为您提供 0-25 范围内的更新值,并将其添加回 'a' 以获得正确的字符。

如果您确实需要同时处理大写和小写,那么您将需要两种不同的情况 - 一种使用“a”,另一种使用“A”。通过检查 isupper(plaintext[character]) 为每个字符选择正确的大小写


推荐阅读