c - 我正在尝试对字符 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要添加key
的26
原因运行程序(由 表示)。这会导致溢出(我假设超过 127)并在循环开始之前变为负数。这会产生垃圾输出。26
z
122
plaintext[character]
while
我知道我可以事先检查潜在的溢出并26
先减去,但这会使我的代码复杂化。我可以给变量“更多空间”以防止它溢出吗?
我是否使用不同的数据类型?这里的最佳做法是什么?
解决方案
如果您只关心小写,那么这对您有用:
for each character in plaintext:
plaintext[character] = (plaintext[character] - 'a' + key) % 26 + 'a'
减去 'a' 得到 0-25 的值,然后添加键。如果发生溢出,模数将为您提供 0-25 范围内的更新值,并将其添加回 'a' 以获得正确的字符。
如果您确实需要同时处理大写和小写,那么您将需要两种不同的情况 - 一种使用“a”,另一种使用“A”。通过检查 isupper(plaintext[character]) 为每个字符选择正确的大小写
推荐阅读
- sdn - Neon、Fluorine-SR2 和 Oxygen-SR4 有什么区别?
- c# - 如何使用 API 并以 JSON 格式返回内容?
- ajax - 三星互联网浏览器忽略 Ajax 请求上的设置 cookie
- microservices - 事件驱动架构中有效负载的策略是什么
- angular - 标头未以角度添加到 HttpClient 中的 Get 请求
- sql - PostgreSQL用组和顺序计算滚动平均值
- python - 如何使用python将div添加到单词列表中
- rust - 如何在 Rust 中对外部数据类型实现 std::hash::Hash 特征?
- python - 如何遍历目录中的 JSON 文件并上传到 mongodb
- reactjs - 如何在url中发送id参数并使用react js在其他页面上获取id参数?