2016-08-02 3 views
-3

Я столкнулся с проблемой при запуске приведенного ниже кода, предназначенного для vigenere cipher.even после тщательного изучения, я не могу отладить проблему. он показывает ошибку: kill by server.please help.Vigenere Cipher

/** 
* 
* vigenere.c 
* 
* Abhishek kumar 
* encrypts entered string using vigenere cipher 
* */ 
#include <stdio.h> 
#include <stdlib.h> 
#include <cs50.h> 
#include <ctype.h> 
#include <string.h> 

int main(int argc, string argv[]) 
{ 
    if (argc != 2) 
    { 
     printf("Usage: /home/cs50/pset2/vigenere <keyword>"); 
     return 1; 
    } 

    if (argc == 2) 
    { string key = argv[1]; 
     for(int k = 0,l = strlen(key);k < l; k++) 
     { 
      if(!isalpha(key[k])) 
      { 
       printf("Keyword must only contain letters A-Z and a-z"); 
       exit(1); 
      } 

     } 


     string txt = GetString(); 
     int i = 0,j = 0,c = 0; 
     int n = strlen(txt); 
     int m = strlen(key); 
     while(i < n) 
     { 
      if (isupper(txt[i])) 
      { 
       if(isupper(key[j])) 
       { 
        c = ((((int) txt[i] - 65 + (int) key[j] -65)%26) + 65); 
        printf("%c", (char) c); 
        i++; 
        j++; 
       } 
       if(islower(key[j])) 
       { 
        c = ((((int) txt[i] - 65 + (int) key[j] -97)%26) + 65); 
        printf("%c", (char) c); 
        i++; 
        j++; 
       } 

      } 
      else if (islower(txt[i])) 
      { 
       if(isupper(key[j])) 
       { 
        c = ((((int) txt[i] - 97 + (int) key[j] -65)%26) + 97); 
        printf("%c", (char) c); 
        i++; 
       } 
       if(islower(key[j])) 
       { 
        c = ((((int) txt[i] - 97 + (int) key[j] -97)%26) + 97); 
        printf("%c", (char) c); 
        j++; 
       } 


      } 
      else 
      { 
       printf("%c",txt[i]); 
       i++; 

      } 
      if (j == m-1) 
      { 
       j = 0; 
      } 
     } 




    } 
} 

Ниже приведены некоторые из тестовых примеров, в которых он неисправен.

:) vigenere.c exists 
:) vigenere.c compiles 
:(encrypts "a" as "a" using "a" as keyword 
    \ killed by server 
:(encrypts "world, say hello!" as "xoqmd, rby gflkp!" using "baz" as keyword 
    \ killed by server 
:(encrypts "BaRFoo" as "CaQGon" using "BaZ" as keyword 
    \ expected output, but not "CGSFpp" 
:(encrypts "BARFOO" as "CAQGON" using "BAZ" as keyword 
    \ expected output, but not "CASFPO" 
:) handles lack of argv[1] 
:) handles argc > 2 
:) rejects "Hax0r2" as keyword 
+0

Пожалуйста, добавьте образец ввода и желаемый результат. – merlin2011

+2

, пожалуйста, задайте вопрос – dustinroepsch

+0

отредактированный, проверка сейчас .. –

ответ

0

В разделе islower(txt[i]), вы не увеличивает i и j во всех случаях. В том месте, где вы не увеличиваете i, то есть где первый символ ключа и текст являются строчными, вы заканчиваете бесконечным циклом.

В разделе isupper(txt[i]) вы увеличиваете i и j в isupper(key[j]) частях, то вы входите в islower(key[j]) часть, потому что вы используете if вместо else if.

Для обоих из указанных выше, изменение if(islower(key[j])) к else if(islower(key[j])), и двигаться j++ и printf после каждого внутреннего блока if. Что касается i, измените while на for и приращение i как часть этого.

При проверке, следует ли вам сбросить j, вы отключены на 1. m-1 является действительным индексом для key, так что вы еще не хотите сбросить настройки. Сделайте это, когда j == m.

Кроме того, замените коды ASCII на действительные символы, которые они представляют, поэтому более ясно, что вы делаете. Броски также не нужны.

for (i=0; i < n; i++) 
    { 
     if (isupper(txt[i])) 
     { 
      if(isupper(key[j])) 
      { 
       c = (((txt[i] - 'A' + key[j] -'A')%26) + 'A'); 
      } 
      else if(islower(key[j])) 
      { 
       c = (((txt[i] - 'A' + key[j] -'a')%26) + 'A'); 
      } 
      printf("%c", c); 
      j++; 
     } 
     else if (islower(txt[i])) 
     { 
      if(isupper(key[j])) 
      { 
       c = (((txt[i] - 'a' + key[j] -'A')%26) + 'a'); 
      } 
      else if(islower(key[j])) 
      { 
       c = (((txt[i] - 'a' + key[j] -'a')%26) + 'a'); 
      } 
      printf("%c", c); 
      j++; 
     } 
     else 
     { 
      printf("%c",txt[i]); 
     } 
     if (j == m) 
     { 
      j = 0; 
     } 
    } 
+0

thanx a ton man.! –

Смежные вопросы