2016-11-30 43 views
0

私はC言語でvigenere暗号を作ろうとしています。入力はアルファベット文字(a-> z)であると仮定されます。vigenere暗号コード

現在のところ、私の問題は4文字を出力し、アルファベットの外に奇妙な文字を出力することだけです。これを防ぐためにif文を作成しましたが、動作していないようです。何かアドバイス?

#include <stdio.h> 


int main(){ 
    int i=0; 
//Vigenere Cipher-- keyword is "apple" 
//a = 1 value shift 
//p = 16 value shift 
//p = 16 value shift 
//l = 17 value shift 
//e = 5 value shift 
//cleaning out string array 
char guy[100]; 

printf("Enter the plain text: "); 
fgets(guy, 100, stdin);//takes user's input 

while (guy[i] != '\0'){ //while loop that runs until it reaches the end of the string 

    if ((i%5==0) || i==0){ //checks to see which character it is in the string, for instance the numbers 0,5,10,15,20 should all be added by 1 
    guy[i] = guy[i]+1; 
    if (guy[i]>'z' && guy[i]<'A'){ 
      guy[i]-25; 
    } 
    if (guy[i]>'Z' && guy[i]>'A'){ 
     guy[i]-25; 
    } 
    } 

    if (((i-1)%5==0) || i==1){ //all numbers that are second in the key word 'apple', such as 1,6,11,16 
     guy[i]=guy[i]+16; 
     if (guy[i]>'z' && guy[i]<'A'){ 
      guy[i]-25; 
     } 
     if (guy[i]>'Z' && guy[i]>'A'){ 
      guy[i]-25; 
     } 
    } 
    if (((i-2)%5==0) || i==2){// all numbers that are third to the key word 'apple' , such as 2,7,12,17,22 
     guy[i]=guy[i]+16; 
     if (guy[i]>'z'&& guy[i]<'A'){ 
      guy[i]-25; 
     } 
     if (guy[i]>'Z'&& guy[i]>'A'){ 
      guy[i]-25; 
     } 
    } 
    if(((i-3)%5==0) || i==3){// all numbers that are fourth to the key word 'apple', such as 3,8,13,18 
     guy[i]=guy[i]+17; 
     if (guy[i]>'z'&&guy[i]<'A'){//takes care of z 
      guy[i]-25; 
    } 
     if (guy[i]>'Z' && guy[i]>'A'){//takes care of Z 
      guy[i]-25; 
     } 
    } 
    if(((i-4)%5==0) || i==4){// all numbers that are fifth in the key word 'apple', such as 4,9,14,19 
     guy[i]=guy[i]+5; 
     if (guy[i]>'z'&& guy[i]<'A'){ 
      guy[i]-25; 
     } 
     if (guy[i]>'Z' && guy[i]>'A'){ 
      guy[i]-25; 
     } 
    } 
    else { 
    i++; 
    } 
    } 
printf("Encrypted text is: %s\n",guy); 
} 
+0

; '。さらに、if(guy [i]> 'Z' && guy [i]> 'A') 'はif(guy [i]> 'Z')と同じです。また、デバッガの使い方を学び、何が起きているのかを確認し、SPACEや数字などを暗号化する必要があるかどうかを考える必要があります。 –

答えて

0

よりもむしろ離れてゲーム全体を与え、ここでいくつかのコードは、私のコメントに基づいて(未テスト!)です:

char encrypt_char(char plain_text, char key) 
{ 
    char offset = tolower(key) - 'a' + 1; 
    if (islower(plain_text)) 
     return (plain_text - 'a' + 1 + offset) % 26 + 'a'; 
    else if (isupper(plain_text)) 
     return (plain_text - 'A' + 1 + offset) % 26 + 'A'; 
    else 
     return plain_text; 
} 

これは、道に沿ってどこかでオフになり、とても楽しいデバッグを持っているかもしれません!

+0

オフセット計算が間違っている(または間違っている!)。 「p」は16でなければならず、「l」は質問に従って17でなければならない。ルックアップテーブルがあるはずです。 – MayurK

+0

これは、 'encrypt_char(guy [i]、apple" [i%5]) 'で呼び出されることを言います。 –

+0

私はそれを理解しています。私が言っているのは、アルファベットの文字のインデックスではないということです。あなたのロジックを正しく理解していれば、{a、p、p、l、e}のオフセット値は{1,16,16,12,5}で間違っています。それは{1,16,16,17,5}でなければなりません。私は理にかなってほしい! – MayurK

1

暗号化を行う関数encrypt_char()があります。

void encrypt_char(char *character, unsigned int offset) 
{ 
    if('a' <= *character && 'z' >= *character) 
    { 
     *character = ((*character + offset - 'a') % 26) + 'a'; 
    } 
    else if('A' <= *character && 'Z' >= *character) 
    { 
     *character = ((*character + offset - 'A') % 26) + 'A'; 
    } 
} 

オフセット値で呼び出します。あなたは本当に `そして`男[I] = encrypt_char(男[i]は、 "りんご" [I%5])とそれを呼び出す関数 `char型encrypt_char(char型のplain_text、文字キー)を記述する必要が

if (i%5==0){ 
    encrypt_char(&(guy[i]), 1); 
} else if ((i-1)%5==0){ 
    encrypt_char(&(guy[i]), 16); 
} else... 
+1

' || i == 0'などはもちろん、0%5 == 0などとしては必要ありません。 –

+0

ええ!私はちょうど質問からコードをコピーしました。それを取り除く。 – MayurK

関連する問題