はなたの日記

プログラミング(C言語)の勉強をしています。超初心者です。

Volume0-0017 Caesar Cipher

問題
シーザー暗号 | Aizu Online Judge

シーザー暗号の復元の問題。思いつくままに実装。
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


問題うんぬんより、細かいところで大事なことを学べました。おしまい。