【问题标题】:ROT13 Implementation using Char Arrays使用字符数组的 ROT13 实现
【发布时间】:2018-08-12 20:22:12
【问题描述】:

我是一名新手程序员,一直致力于 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...) 下面的任何数字都会变成结果为负索引并引发错误。

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

【问题讨论】:

  • 这个例子有点愚蠢,因为alphabet[i] - 'A' == i。所以rot13[i] 也可以。无论如何,它依赖于字符'A''Z' 的ASCII 码是连续的,例如'B' == 'A' + 1。从这里可以看出'B' - 'A' == 1

标签: c++ arrays char rot13


【解决方案1】:

鉴于alphabet[i] 是一个大写字母(在您的示例中就是这种情况),alphabet[i] - 'A' 将计算到 ASCII 表中字母“A”的距离。所以'A'-'A' 将为 0,'B'-'A' 将为 1,依此类推,直到 'Z'-'A' 为 25。

你的字符数组rot13被写成索引0有字母'N',索引1是字母'O'等等,直到索引12有字母'Z',然后索引13是'A',索引 14 是 'B',依此类推,直到索引 25 是 '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 被分配给'A'-'A',即0letterAfterRot13分配给数组rot13 的索引0 处的元素,即'N'。所以'A'这个字母就变成了'N'

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

【讨论】:

  • 这很有道理,感谢您详细的分步回复。
  • 感谢@RemyLebeau,我对编辑它犹豫不决,但我认为编辑已被接受的答案是错误的。
最近更新 更多