2017-11-18 40 views
1

シーザー暗号を作成しようとしていますので、すべての文字を13回プッシュする関数を宣言しました。そして、文字列を受け取り、それを暗号化または復号化する別の関数をforループで実行しました。 しかし、問題は、私はプログラムの開発を実行すると、これが出て来るものであるということである。シーザー暗号はC言語では機能しません

Original: This is the Original text 
encrypted: QnÇ vÇü qre Bevtvanyüràü 
decrypted: DaÇ âÇü der Orâüânaåüeàü 

誰がこれを引き起こしている可能性がありますどのようなアイデアを持っていますか?

#include <stdio.h> 
#include <stdlib.h> 

int shift = 13; 

char shiftchar(char ch){ 
    if(((ch > 64) && (ch< 91)) || ((ch > 96) && (ch < 123))){ 
     ch = ch + shift; 
     if(ch > 90 && ch < 104){ 
      ch = ch - 90 +64; 
     } 
     else if(ch > 122 && ch < 136){ 
      ch = ch -122 +96; 
     } 
    } 
    else{ 
    ch = ch; 
    } 
} 

void cipher (char str[]){ 

    for(int i = 0; str[i] != 0; ++i){ 
     str[i] = shiftchar(str[i]); 
    } 
} 

int main(void){ 

    char str[25] = "This is the original text"; 

    printf("Original: "); 
    printf("%s\n", str); 

    cipher(str); 
    printf("encrypted: "); 
    printf("%s\n", str); 

    cipher(str); 
    printf("decrypted: "); 
    printf("%s\n", str); 
} 
+3

数値 '64'、91'' '96'、' 123'、 '90'、' 104'、 '122'、' 136'は赤いフラグであるの使用。文字定数「A」、「Z」、「a」、「z」を使用し、 '>'を '> ='と '<'〜 '' <= ' 。 ''の 'isupper()'と 'islower()'関数も役に立ちます。 –

答えて

1

コードに2つのバグがありました。まず、タイプcharの変数はから127の範囲の値でメモリ内に8 bitsを取ります。場合によっては、暗号化された文字が127より大きい値になることがありますので、代わりに0から255の範囲の値をとるデータ型としてunsigned charを使用する必要があります。 char shiftchar(unsigned char ch);

のコード行は必要もありません:

だから、あなたの関数の宣言は次のようになります。ch = ch;が、あなたはまた、あなたの関数から生じた暗号化文字を返しませんでした。

最後の関数は次のようになります。今では、必要に応じて

char shiftchar(unsigned char ch){ 
    if(((ch > 64) && (ch< 91)) || ((ch > 96) && (ch < 123))){ 
     ch = ch + shift; 
     if(ch > 90 && ch < 104){ 
      ch = ch - 90 +64; 
     } 
     else if(ch > 122 && ch < 136){ 
      ch = ch -122 +96; 
     } 
    } 
    return ch; 
} 

あなたのコードは機能しますが、すべてが完璧に行っているために、私たちはあなたの文字配列のサイズを変更する必要があります。 main25に配列char str[]のサイズを設定します。

あなたの配列を初期化するために使用するリテラル任意の文字列の最後に目に見えないNULL終了文字を決して忘れません。

配列の宣言は次のようになります。char str[26] = "This is the original text";、あなたも\0を忘れるの頭痛を回避することができ、あなたの代わりにこれを行うことができます:char str[] = "This is the original text";は、このように配列のサイズを決定するために、コンパイラにジョブを残し;)

0

あなたはchar文字列が本当にnull終端バイト文字列と呼ばれていることを忘れているように見えます。 ヌルターミネーターは、すべての標準関数が文字列の終わりを知るために探しているものなので、非常に重要です。

配列strは、ターミネータに合うように小さくなります。代わりに26要素の配列にします。また、サイズを明示的に指定してコンパイラに設定させないでください。

0

あなたのコードをテストしましたが、unsignedの問題のほかに、の文がshiftcharの機能にありません。

char shiftchar(unsigned char ch){ 
    if(((ch > 64) && (ch< 91)) || ((ch > 96) && (ch < 123))){ 
     ch = ch + shift; 
     if(ch > 90 && ch < 104){ 
      ch = ch - 90 +64; 
     } 
     else if(ch > 122 && ch < 136){ 
      ch = ch -122 +96; 
     } 
    } 
    else{ 
    ch = ch; 
    } 
    return ch; 
} 
+0

コンパイラの中には、 'ch = ch;'というエラーメッセージを返すものもあります。それはまったく必要ありません。 –

+0

確かに。私はそれを取り除くべきだった。 –

関連する問題