使用 Char 数组的 ROT13 实现
ROT13 Implementation using Char Arrays
我是一名新手程序员,一直致力于 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]
是大写字母(在您的示例中就是这种情况),alphabet[i] - 'A'
将计算到 ASCII table 中字母 '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'
即 0
,letterAfterRot13
被赋值给索引 0
处的数组 rot13
的元素,即 'N'
。于是字母'A'
就变成了'N'
.
你可以对任何字母做同样的事情,你会发现一切都很好,包括你认为事情会越界的边缘情况。使用此技术不能有负索引。
我是一名新手程序员,一直致力于 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]
是大写字母(在您的示例中就是这种情况),alphabet[i] - 'A'
将计算到 ASCII table 中字母 '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'
即 0
,letterAfterRot13
被赋值给索引 0
处的数组 rot13
的元素,即 'N'
。于是字母'A'
就变成了'N'
.
你可以对任何字母做同样的事情,你会发现一切都很好,包括你认为事情会越界的边缘情况。使用此技术不能有负索引。