2016-03-25 5 views
-4

Моя программа отлично работает, за исключением случаев ввода ввода командной строки BaZ и ввода BaRFoo. Программа должна зашифровать ее как CaQGon, однако она выводит CaQGoh вместо этого. Я действительно смущен, почему это происходит, потому что программа отлично работает для любого другого ключа и ввода. Именно эта конкретная комбинация не работает. BTW, моя программа должна шифроваться с использованием шифрования vigenere.Программа работает, но имеет 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'? Что такое переменная 'c' в цикле, за исключением вызовов' isupper'/'islower'? –

ответ

0

Эта линия

int key = currentkeynum - lower; 

потерпит неудачу, когда currentkeynum заглавная, что вы не проверить. Ваш код работает только тогда, когда ключ и письма сообщений имеют одинаковый случай.

Input: BaRFoo 
Key: BaZBaZ 

Вы можете видеть, что они соответствуют случаю, пока не достигнете последней буквы.

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

  • Нет связанных вопросов^_^