티스토리 뷰

Hobby/Code

[C] vigenere cipher

생각많은 소심남 2014. 5. 25. 03:08

In CS50 class of edX,

두번째 과제였던 vigenere 방식인데,

이전 caesar 방식은 단순히 integer 형식의 key값을 준것과 다르게 vigenere 방식은 keyword를 기반으로 encode한다.

즉 keyword를 구성하는 alphabet이 caesar에서 말한 shift value가 되는 것이다.

역시 대충짜서 코드가 지저분하다.


일반 C에서 쓸 사람은 중간에 GetString()부분만 수정해주면 된다.

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

#define LOWER   97
#define UPPER   65

int main(int argc, char* argv[])
{
    if(argc != 2){
        printf("you must enter single parameter to execute\n");
        return 1;
    }
    
    string k = argv[1];
    for( int i = 0; i < strlen(k); i++){
        if(!isalpha(k[i])){
            printf(" you should enter alphabet word as a keyword!\n");
            return 1;
        }
    }
    
    int index = 0;
    int temp = 0;
    
    string input = GetString();
    for ( int i = 0; i < strlen(input); i++){
        if(islower(k[index % strlen(k)])) temp = (k[index % strlen(k)] - LOWER);
        else temp = (k[index % strlen(k)] - UPPER);
        
        if(isalpha(input[i])){
            if(islower(input[i])) printf("%c", LOWER + (input[i] - LOWER + temp) % 26);
            else printf("%c", UPPER + (input[i] - UPPER + temp) % 26);
            index++;
        } 
        else printf("%c", input[i]);
    }
    printf("\n"); 
    
    return 0; 

}


'Hobby > Code' 카테고리의 다른 글

[C] Squared Matrix transpose  (0) 2014.05.27
[C] matrix multiplication using dynamic memory allocation  (0) 2014.05.27
[C] fifteen game  (0) 2014.05.26
[C] Caesar Cipher  (1) 2014.05.25
[ruby] Rock-Paper-Scissors class  (0) 2014.05.19
[ruby] Very simple class for dessert  (0) 2014.05.19
[Ruby] Palindrome, dictionary, anagram  (0) 2014.05.18
댓글