最可靠的方法是为每个类别使用一个表,并对其索引进行算术运算,以表的大小为模。因此,对于小写字母,您可能会执行以下操作:
char
transcode( char original )
{
char results = original;
static std::string const lower( "abcdefghijklmnopqrstuvwxyz" );
auto pos = std::find( lower.begin(), lower.end(), results );
if ( pos != lower.end() ) {
int index = pos - lower.begin();
index = (index + 2) % lower.size();
results = lower[ index ];
}
return results;
}
此解决方案是通用的,无论您要处理的字母集如何,都可以使用。对于数字(以及大小写,如果您不太担心可移植性),您可以利用代码点是连续的这一事实,并执行以下操作:
char
transcode( char original )
{
char results = original;
if ( results >= '0' && results <= '9' ) {
char tmp = results - '0'
tmp = (tmp + 2) % 10;
results = tmp + '0';
}
return results;
}
另一种实现是使用类似的东西:
results = results + 2;
if ( results > '9' ) {
results -= 10;
}
在if
上面。这两个解在数学上是等价的。
这仅保证适用于数字,但如果您将自己限制为原始 ASCII 字符集,则通常适用于大写或小写。(请注意,当今大多数系统都支持扩展字符集。)