-
CS50 Week2: Problem Set, CaesarProgramming/CS50 2023. 7. 5. 02:34
하버드 CS50 2주차 Problem Set 과제 Caesar 의 풀이 과정을 다룹니다.
C언어로 Command-line Argument를 배열로 받아, 받은 문자열을 암호화는 문제입니다.Intro
문제 링크에서 자세한 내용을 확인할 수 있습니다.
Caesar's Cipher 를 통한 암호화 예제
$ ./caesar 1 plaintext: HELLO ciphertext: IFMMP
Detail
- command-line argument를 통해 cipher key 값을 받는다. 인자가 여럿이거나 숫자가 아닐 경우 오류 메시지와 함께 1을 반환해야 한다.
- 암호화 시 대문자/소문자를 보존해야한다.
Code
처음엔 어려워보였는데 막상 시작하니 할만 했다.
문자를 숫자로 바꿀 때 이전 문제에서letter - 65
를 했었는데, 알고보니letter - 'A'
이렇게 문자를 직접 써도 된다.
코드 읽기에도 더 직관적이다.#include <ctype.h> #include <stdbool.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include "cs50.h" char rotate(char letter, int key); bool has_only_digits(string s); int main(int argc, string argv[]) { if (argc != 2 || !has_only_digits(argv[1])) { printf("Usage: ./caesar key\n"); return 1; } int key = atoi(argv[1]); string plaintext = get_string("plaintext: "); printf("ciphertext: "); for (int i = 0, n = strlen(plaintext); i < n; i++) { printf("%c", rotate(plaintext[i], key)); } printf("\n"); } char rotate(char letter, int key) { if (isupper(letter)) { return (letter - 'A' + key) % 26 + 'A'; } else if (islower(letter)) { return (letter - 'a' + key) % 26 + 'a'; } else { return letter; } } bool has_only_digits(string s) { for (int i = 0, n = strlen(s); i < n; i++) { if (!isdigit(s[i])) { return false; } } return true; }