2016-04-11 7 views
1

基本的に私は、それぞれの文字をint 'k'離れた文字で置き換えるだけのシーザー暗号を作成する必要があります。これは2つのコマンドライン引数をとります: './caesar'と 'k'。これはユーザによって与えられます。それはうまく動作します。それは がCaesar Cipherは文字を繰り返します

正しいキーとして4を使用して「FeVJss」として「BaRFoo」を暗号化し、それを暗号化しません正しいキーとして3を使用して「EDUIRR」として「BARFOO」を暗号化し

:が、1つの問題があります"barfoo"を "onesbb"として65をキーとして "oonneess | bb | bb"として暗号化します。

句読点に注意してください。帽子など。

ここに問題がありますか?他のランダムな言葉に対してもこれを行います。文字を繰り返します。助けてください....

PS:私のコードで見ることができるように、プログラミングには全く新しいので、英語で説明してください!

#include <stdio.h> 
#include <cs50.h> 
#include <string.h> 
#include <stdlib.h> 
int main(int argc, string argv[]) 
{ 
string s; 
//int d; 
int c; 
int a; 
if(argc != 2) 
{ 
    printf("Please run with a command line argument."); 
    return 1; 
} 
else 
{ 
    s = GetString(); 
} 
int k = atoi(argv[1]); 

for(int i = 0; i < strlen(s); i++) 
    { 
     a = s[i]; 
     if(a<'A'||a>'z') 
     { 
      printf(" "); 
     } 
     else 
     { 
      if(a>='A'&&a<='Z') 
      { 
       c = a+k; 
       while(c>'Z') 
       { 
        c = 'A'+(c-'Z')-1; 
        printf("%c", c); 
       } 

       if(c<='Z') 
       { 
        printf("%c", c); 
       } 
      } 
      else if(a>-'a'&&a<='z') 
      { 
       c = a+k; 
       while(c>'z') 
       { 
        c = 'a'+(c-'z')-1; 
        printf("%c", c); 
       } 
       if(c<='z') 
       { 
        printf("%c", c); 
       } 
      } 
     } 
    } 
printf("\n"); 
} 
+2

この情報は以下のとおりです:a> - 'a' –

+1

ヘルプme ....確かに!デバッガの下でコードを実行し、失敗したケースを実行します。 –

+0

あなたは "c = a + k;"と書いています。 kが1000の場合はどうなりますか?あなたが手紙の数を渡す場合?あなたは%演算子を使っています。 – JoulinRouge

答えて

2

あなたはそれがアルファベットの文字を包み込むはずなのでk%26を取るしようとすることができます。 それはあなたの問題を解決するはずです。

1

この方法で試してください。大文字の場合を取る。まず、文字 'A'からインデックスを取得します。 index = a - 'A';

次に変数kに値を追加して、希望の文字だけ'A'でそれを追加を取得するために26今

modified_index = (index + k) % 26;

で割った余りを取得します。

c = 'A' + modified_index;

のみk%26を追加すると増分1で'z'が間違っている{に変換されますその方法として役立つことはありません。

また、変数aで示された文字でkに値を追加すると、Joulinが指摘したようにASCII文字の制限を超える可能性があります。

関連する問題