文字の検索・置換〜Leet文字列
(準備中)
HELLOをH3LL0に置き換えるなど、アルファベットを似た別の文字や数字に置き換えた
文字列をLEET文字列といいます。
例えば、
A -> 4
E -> 3
G -> 6
I -> 1
O -> 0
P -> 9
S -> 5
Z -> 2
などに置換します。(このパターンに限りません)
LEET文字列を作るプログラムは文字の検索と置換のちょうどよい題材になるので
いくつかのサンプルを作ってみました。
LEET1.c
入力した文字列を1文字づつif文でチェックして置き換えていく、力技プログラム。
#include <string.h> int main(void){ int i,s; char str[200]; scanf("%s",str); s=strlen(str); for (i=0;i <=s;i++) { if (str[i]=='A') str[i]='4'; if (str[i]=='E') str[i]='3'; if (str[i]=='G') str[i]='6'; if (str[i]=='I') str[i]='1'; if (str[i]=='O') str[i]='0'; if (str[i]=='P') str[i]='9'; if (str[i]=='S') str[i]='5'; if (str[i]=='Z') str[i]='2'; } printf("%s\n", str); return 0; }
LEET2.C
for文のループをwhileにしてみただけ
#include <string.h> int main(void){ int i,s; char str[200]; scanf("%s",str); s=strlen(str); i=0; while (i<=s) { if (str[i]=='A') str[i]='4'; if (str[i]=='E') str[i]='3'; if (str[i]=='G') str[i]='6'; if (str[i]=='I') str[i]='1'; if (str[i]=='O') str[i]='0'; if (str[i]=='P') str[i]='9'; if (str[i]=='S') str[i]='5'; if (str[i]=='Z') str[i]='2'; i++; } printf("%s\n", str); return 0; }
LEET3.C
これまではstrlen()で入力された文字列の文字数をカウントして、その回数分ループを回していましたが、
C言語の場合は文字列の終わりは'\0'なので、'\0'を検出したらループを抜けるようにした。
#include <string.h> int main(void){ int i; char str[200]; scanf("%s",str); /* s=strlen(str); */ i=0; while (str[i] !='\0') { if (str[i]=='A') str[i]='4'; if (str[i]=='E') str[i]='3'; if (str[i]=='G') str[i]='6'; if (str[i]=='I') str[i]='1'; if (str[i]=='O') str[i]='0'; if (str[i]=='P') str[i]='9'; if (str[i]=='S') str[i]='5'; if (str[i]=='Z') str[i]='2'; i++; } printf("%s\n", str); return 0; }
LEET4.C
いままでは文字の判断をif文で行っていたが、
switch ..
case
にしてみた。
#include <stdio.h> #include <string.h> int main(void){ int i; char str[200]; scanf("%s",str); /* s=strlen(str); */ i=0; while (str[i] !='\0') { switch(str[i]){ case 'A': str[i]='4'; break; case'E': str[i]='3'; break; case'G': str[i]='6'; break; case'I': str[i]='1'; break; case'O': str[i]='0'; break; case'P': str[i]='9'; break; case 'S': str[i]='5'; break; case'Z': str[i]='2'; } i++; } printf("%s\n", str); return 0; }
LEET5.C
if文を使うにしろ、switch ... case 文を使いうにしろ、置き換える文字パターンが多いと
だらだらとif文やcase文を書くことになる。
LEET文字のような決まった置き換えパターンに従う場合は、
置き換え前の文字を*sに、置き換え後の文字を*rに設定すれば、いかのように
すっきりしたコードにすることもできる。
#include <string.h> int main(void){ int i,j; char str[200],*s="AEGIOPSZ", *r="43610952"; scanf("%s",str); /* s=strlen(str); */ i=0; while (str[i] !='\0') { for (j=0; j<=7;j++) { if (str[i]==s[j]) {str[i]=r[j];} } i++; } printf("%s\n", str); return 0;
LEET4とLEET5の実行例
LEET1〜LEET5は全て同じ動作をするので、どれを実行しても同じ。
c:\bcc55\Bin>leet4 GEOMETRY 630M3TRY c:\bcc55\Bin>leet5 POSITION 9051T10N