首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Char数组的ROT13实现

使用Char数组的ROT13实现
EN

Stack Overflow用户
提问于 2018-08-13 04:22:13
回答 1查看 633关注 0票数 0

我是一个新手程序员,作为教程的一部分,我一直在开发ROT13实现,并遇到了以下代码。它输出正确的字符,但是我不太确定它是如何工作的,也没有附加的解释。

代码语言:javascript
复制
char rot13[] = { 'N','O','P','Q','R','S','T','U','V','W','X','Y','Z','A','B','C','D','E','F','G','H','I','J','K','L','M' };
std::string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

for (int i = 0; i < alphabet.length(); i++) {
    std::cout << rot13[alphabet[i] - 'A'];
}

具体地说,我不太明白从字符串字母表中的字符减去'A‘如何提供我们的ROT13编号。我最初认为'A‘对应于rot13[]中的一个索引,减去它将为我们提供一个新的索引,但是这不会表明A的索引(Z,Y,X...)下的任何数字。会变成负索引,并抛出错误。

有人能给我解释一下这段代码背后的逻辑吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-13 04:39:08

假设alphabet[i]是一个大写字母(示例中就是这种情况),alphabet[i] - 'A'将计算到ASCII表中字母'A‘的距离。因此,'A'-'A'将为0,'B'-'A'将为1,依此类推,直到'Z'-'A'为25。

字符数组rot13的写法是这样的:索引0包含字母'N',索引1包含字母'O',依此类推,直到包含字母'Z'的索引12,然后索引13是'A',索引14是'B',依此类推,直到索引25,即'M'

为了让事情更清楚,让我们重写这一行:

代码语言:javascript
复制
std::cout << rot13[alphabet[i] - 'A'];

作为:

代码语言:javascript
复制
char letterBeforeRot13 = alphabet[i];
int index = letterBeforeRot13 - 'A';
char letterAfterRot13 = rot13[index];
std::cout << letterAfterRot13;

这几乎就是你的编译器所做的,但有更多的细节。

如果我们选择一个示例,其中alphabet[i]等于字母'A'letterBeforeRot13被分配给字母'A'index被分配给'A'-'A',它是0letterAfterRot13被分配给索引0处的数组rot13的元素,即'N'。因此,字母'A'被转换为'N'

您可以对任何字母执行相同的操作,您将看到一切都很好,包括当您认为事情会越界时的边缘情况。使用此技术时,您不能使用负索引。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51812528

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档