2016-03-25 8 views
-4

私のプログラムは、BaZのコマンドライン入力とBaRFooの入力を入力する以外は正常です。プログラムはCaqGonとして暗号化する必要がありますが、代わりにCaQGohを出力します。私は、プログラムが他のキーと入力に対して正常に動作するため、なぜこれが起こるのかについて本当に混乱しています。これはうまく動作しないこの特定の組み合わせです。ところで、私のプログラムは、vigenere暗号を使って暗号化されています。 currentkeynumは、あなたがチェックしていない何か大文字のときプログラムは動作しますが、1つのバグを持っています

#include <stdio.h> 
#include <cs50.h> 
#include <string.h> 
#include <ctype.h> 
#include <stdlib.h> 

string input; 
int digitnum = 0; 
string keyInput; 

int main(int argc, string argv[]) 
{ 
    keyInput = argv[1]; 

    if (argc>2 || argc<2) 
    { 
     printf("Please enter a valid argument.n"); 
     return 1; 
    } 

    for (int n = 0, keylength = strlen(argv[1]); n < keylength; n++) 
    { 
     if ((keyInput[n] >= '0') && (keyInput[n] <= '9')) 
     { 
      printf("Please enter an alphabetical keyword."); 
      return 1; 
     } 
    } 

    input = GetString(); 

    for (int i = 0; i < strlen(input); i++) 
    { 
     char c = input[i]; 

     if (isalpha(input[i])) 
     { 
      char currentletter = input[i]; 
      int letternum = currentletter; 
      char currentkey = keyInput[digitnum]; 
      int currentkeynum = currentkey; 

      if(isupper(c)) 
      { 
       int upper = 'A'; 
       int alphanum = letternum - upper; 
       int key = currentkeynum - upper; 
       int newint = (alphanum + key) % 26; 
       newint = newint + upper; 
       char newchar = newint; 
       printf("%c", newchar); 
      } 
      if(islower(c)) 
      { 
       int lower = 'a'; 
       int alphanum = letternum - lower; 
       int key = currentkeynum - lower; 
       int newint = (alphanum + key) % 26; 
       newint = newint + lower; 
       char newchar = newint; 
       printf("%c", newchar); 
      } 

      digitnum = digitnum + 1; 

      if (digitnum >= strlen(keyInput)) 
      { 
       digitnum = 0; 
      } 
     } 
     else 
     { 
      printf("%c", input[i]); 
     } 
    } 
    printf("\n"); 
} 
+4

「これは機能しないこの特定の組み合わせです」 - 素晴らしい!デバッガで問題をトレースするのは簡単です。 –

+0

考えられる単純化のヒント: 'isupper'と' islower'ブランチのコードはまったく同じなので、 'upper'と' lower'変数を除いて、なぜ共通変数に '' A ''または '' a''を使用し、代わりにその単一の変数を使用しますか?コードの重複が少ないほど、より優れた複製が可能になります。 –

+0

ところで、 'string'とは何ですか? 'GetString'は何をしますか? 'isupper' /' islower'呼び出し以外の 'c'変数のループ内での使用は何ですか? –

答えて

0

このライン

int key = currentkeynum - lower; 

は失敗します。あなたのコードは、キーとメッセージ文字の両方が大文字である場合にのみ機能します。

最後の文字に達するまで大文字と小文字が一致することがわかります。

関連する問題