2016-10-05 3 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의 길이를 위해 작동하는 것 같다. 예를 들면, I 입력 'AAAA'

의 인수이어서 올바르게 입력 'BBBBB'BBBBB " 받는 스트링.

그러나, 내가 입력 같은 'AAAA'

그런 다음 입력 이상 키 +1 'bbbbbbb' 보다 문자열이 내가받을 'bbbbbNN'

은 내가 내 주문에 문제가 생각 작동하지만 주위에 움직이는 괄호를 쓸모없는 시도했다. 내 열쇠가 제대로 포장되지 않는 이유에 대해 누군가가 올바른 방향으로 나를 가리킬 수 있기를 바랍니다.

+0

나는 당신의 입력이 재현 할 수없는'aaaa'와'bbbbbbb', 난 그냥 '할당, 어떤'string' 유형을 사용하고 있지 않다하더라도 숯불 * k에 =을 argv [: 그것은 당신을 위해 더 나은 작동하는지 확인 1];''char * code = argv [2]; 나머지는 게시자의 것입니다. –

+1

세 번째 printf는'printf ("% c", ((code [a] - 'a') + k (% c)] 여야한다고 생각합니다. [b % klen] - 'A')) % 26) + 'a'); '. –

+0

Bob, 고마워. 그것은 분명히 문제의 일부였습니다. 내 코드를 업데이트했지만, 지금은'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

나는 당신의 충고를 받아 들여 코드 루프 밖에서 키를 처리했다. 그것은 여전히 ​​조금 혼란스럽고 단순화 될 수 있지만 적어도 지금은 작동합니다. 그리고 나는 그것의 효율성을 개선하기 위해 노력할 수 있습니다. 다시 한번 감사드립니다. –