2016-10-05 10 views
-1

Я работал над cs50 pset2, и я думал, что у меня есть шифр vigenere после работы над ним в течение нескольких дней. Этот код предназначен для использования алфавитного аргумента (argv []), заданного пользователем, и использовать его как ключ для склеивания фразы, заданной пользователем (строкой) по ее числу в алфавитном индексе. Например, если вы даете аргумент «abc» и строку «cat», тогда вывод должен быть «cbv» (перемещение 0, b перемещение 1, c перемещение 2). Аргумент также должен быть обернут вокруг, так что если строка дольше аргумент будет перенесен на первый символ и будет продолжаться до тех пор, пока строка не закончится.Vigenere Cipher. Выход кода

Это то, что у меня есть для кода:

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


int main(int argc, string argv[]) 
{ 


    if(argc != 2) 
     { 
      printf("Try again\n"); 
      return 1; 
     } 
    string k = (argv[1]); 

    int klen = strlen(k); 


    for(int x = 0; x < klen; x++) 
     { 
      if(isalpha(k[x])) 
       { 
        if(isupper(k[x])) 
         { 
          k[x] = tolower(k[x]); 
         } 

         k[x] -= 'a'; 
       } 
      else 
       { 
        printf("Try again\n"); 
        return 1; 
       } 
     } 

    string code = GetString(); 

    int clen = strlen(code); 

    for(int a = 0, b = 0; a < clen; a++) 
     { 
      if(isalpha(code[a])) 
       { 
        int key = k[b%klen]; 
        if(isupper(code[a])) 
         { 
          printf("%c", (((code[a] - 'A') + key)%26) + 'A'); 
          b++; 
         } 
        else 
         { 
          printf("%c", (((code[a] - 'a') + key)%26) + 'a'); 
          b++; 
         } 
       } 
      else 
       { 
        printf("%c", code[a]); 
       } 
     } 
    printf("\n"); 
} 

код, кажется, работает на длине ключа +1. Например, я входной аргумент «AAAA»

Затем введите строку «» BBBBB и получить «BBBBB» правильно.

Однако, если вход такой же «аааа»

Затем ввести строку длиннее ключ +1 «» BBBBBBB я получаю «bbbbbNN»

Я считаю, что у меня есть проблемы с моим заказом операций, но попытались перемещать круглые скобки вокруг безрезультатно. Я надеялся, что кто-то может указать мне в правильном направлении, почему мой ключ не обертывается должным образом.

+0

Я не могу воспроизвести это для ввода '' aaaa' и bbbbbbb', хотя я не использую любой 'string' типа, просто назначая' символ * к = ARGV [ 1]; 'и' char * code = argv [2]; 'остальное, как вы писали. Я предлагаю вам распечатать значение 'int klen = strlen (k);' –

+1

Я думаю, что ваш третий printf должен быть 'printf ("% c ", (((код [a] - 'a') + (k [b% klen] - 'A'))% 26) + 'a'); '. –

+0

Боб, спасибо за это. Это определенно было частью проблемы. Я обновил свой код, но теперь вместо 'bbbbbNN' я получаю' bbbbbhh'. Кажется, у меня все еще возникают проблемы с переносом ключа вокруг кода. –

ответ

0

Ваш самый большой риск с кодом, подобным этому, - все подобные, повторяющиеся предложения. Ошибка в одном из них трудно отследить. И выполнение любой обработки на ключе, при обработке кода, просто неэффективно.

Это переделка, которая полностью обрабатывает ключ перед обработкой кода и пытается получить обработку вплоть до одного случая. Смотрите, если он работает лучше для вас:

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

int main(int argc, string argv[]) 
{ 

    if (argc != 2) 
    { 
     fprintf(stderr, "Try again\n"); 
     return EXIT_FAILURE; 
    } 

    string key = strdup(argv[1]); 

    size_t key_length = strlen(key); 

    for (int x = 0; x < key_length; x++) 
    { 
     if (isalpha(key[x])) 
     { 
      if (isupper(key[x])) 
      { 
       key[x] = tolower(key[x]); 
      } 

      key[x] -= 'a'; 
     } 
     else 
     { 
      fprintf(stderr, "Try again\n"); 
      return EXIT_FAILURE; 
     } 
    } 

    string code = GetString(); 
    int code_length = strlen(code); 

    for (int a = 0, b = 0; a < code_length; a++) 
    { 
     if (isalpha(code[a])) 
     { 
      int start = isupper(code[a]) ? 'A' : 'a'; 

      printf("%c", (((code[a] - start) + key[b++ % key_length]) % 26) + start); 
     } 
     else 
     { 
      printf("%c", code[a]); 
     } 
    } 

    printf("\n"); 

    free(key); 

    return EXIT_SUCCESS; 
} 
+0

Спасибо за ответ. Я все еще очень новичок в этом и не понимаю некоторых из того, что вы написали, но я постараюсь получить ключ, установленный перед кодом, и посмотреть, что произойдет. –

+0

Я принял ваш совет и обработал их ключ вне цикла кода, и он работает! Он все еще немного грязный и может быть упрощен, но по крайней мере он работает сейчас, и я могу работать над повышением его эффективности. Еще раз спасибо. –

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

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