最も確実な方法は、各カテゴリにテーブルを使用し、テーブルのサイズを法として、そのインデックスで計算を行うことです。したがって、小文字だけの場合は、次のようにすることができます。
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
。これら 2 つの解は、数学的に同等です。
これは数字に対してのみ機能することが保証されていますが、元の ASCII 文字セットに限定すると、通常は大文字でも小文字でも機能します。(現在、ほとんどのシステムが拡張文字セットをサポートしていることに注意してください。)