Volume0-0017 Caesar Cipher
シーザー暗号の復元の問題。思いつくままに実装。
1. i文字ずらす
2. 復号できてるかチェック
を繰り返すという単純なもの。ifがめっちゃ入れ子になっている部分は非常に恥ずかしい。
#include<stdio.h> #include<string.h> #include<ctype.h> #define MAX 100 void henkan(char str[],int x){ int i; int len=strlen(str); for(i=0;i<len;i++){ if( isalpha(str[i]) ) str[i]=(str[i]-'a'+x)%26+'a'; } return; } int check(char str[]){ int i; int len=strlen(str); for(i=0;i<len;i++){ if(str[i]=='t'){ if(str[i+1]=='h'){ if(str[i+2]=='e'){ if(str[i+3]==' '){printf("%s\n",str);return 1;} } else if(str[i+2]=='i'){ if(str[i+3]=='s' && str[i+4]==' '){printf("%s\n",str);return 1;} } else if(str[i+2]=='a'){ if(str[i+3]=='t' && str[i+4]==' '){printf("%s\n",str);return 1;} } } } } return 0; } int main(){ char str[MAX]; char copy[MAX]; int i; while(scanf("%[^\n]",str)!=EOF){ strcpy(copy,str); for(i=1;i<=26;i++){ strcpy(str,copy); henkan(str,i); if(check(str))break; } scanf("%*c"); } return 0; }
ふつう文字列は空白までしか読み込めないが、以下のようにすれば改行以外すべて読み込んでくれるらしい。
scanf("%[^\n]",str)
あとは残った改行を飛ばすために、scanf("%*c")としてる。
参考
qiita.com
問題うんぬんより、細かいところで大事なことを学べました。おしまい。