使用字符数组的ROT13实现

时间:2018-08-12 20:22:13

标签: c++ arrays char rot13

我是一名新手程序员,作为本教程的一部分,她一直在研究ROT13实现,并遇到了以下代码。它会输出正确的字符,但是我不太确定它是如何工作的,没有附加说明。

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 ...)都会变为结果是负索引并抛出错误。

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

1 个答案:

答案 0 :(得分:2)

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

写入您的字符数组rot13使得索引0为字母'N',索引1为字母'O',依此类推,直到索引12为字母{{ 1}},然后索引13为'Z',索引14为'A',依此类推,直到索引25为'B'

为了使情况更清楚,让我们重写此行:

'M'

为:

std::cout << rot13[alphabet[i] - 'A'];

这几乎是您的编译器的工作,但有更多详细信息。

如果我们选择一个示例,其中char letterBeforeRot13 = alphabet[i]; int index = letterBeforeRot13 - 'A'; char letterAfterRot13 = rot13[index]; std::cout << letterAfterRot13; 等于字母alphabet[i],则'A'被分配给字母letterBeforeRot13'A'被分配给{{ index的1}},'A'-'A'被分配给索引为0的索引letterAfterRot13的数组rot13的元素。因此,字母0被转换为'N'

您可以对任何字母执行相同的操作,您会发现一切都很好,包括当您认为事情可能会超出范围时的极端情况。使用此技术不能使用负索引。