Here is the reference solution for Problem Set 2, caesar.c
// Encrypt a message using the Caesar cypher, with a user-provided key.// This is CS50x pset2 caesar.c//// Author: david@newtongwc.org//// Usage: caesar <secret>//// Reads the (new-line-terminated) clear-text message from stdin, writes the// crypt-text message to stdout.#include <stdio.h>#include <ctype.h>#include <string.h>#include <cs50.h>#define true 1#define false 0int ArgsAreValid(int argc, string argv[]) {    if (argc != 2) {        printf("Error: You must supply exactly 1 argument to %s\n", argv[0]);        return false;    }    if (atoi(argv[1]) < 0) {        printf("Error: The ceaser secret must be a non-negative integer\n");        return false;    }    return true;}int GetSecret(int argc, string argv[]) {    return atoi(argv[1]);}// Encrypt a single character by shifting it some number ("secret") of places// up the alphabet, wrapping around from 'z' to 'a'. Works for both upper- and// lower-case letters, staying within the same case. Leaves non-alphabetic// characters unchanged.char EncryptChar(char clear, int secret) {    char crypt = 0;    if (isupper(clear)) {        crypt = (clear - 'A' + secret) % 26 + 'A';    } else if (islower(clear)) {        crypt = (clear - 'a' + secret) % 26 + 'a';    } else {        crypt = clear;    }    return crypt;}// Encrypts a full message, one character at a time, using the provided// encryption secret.string Encrypt(string clear_text, int secret) {    string crypt_text = malloc(strlen(clear_text) * sizeof(char));    int num_chars = strlen(clear_text);    for (int i = 0; i < num_chars; ++i) {        crypt_text[i] = EncryptChar(clear_text[i], secret);    }    return crypt_text;}int main(int argc, string argv[]) {    if (!ArgsAreValid(argc, argv)) {        return 1;    }    int secret = GetSecret(argc, argv);    string clear_text = GetString();    string crypt_text = Encrypt(clear_text, secret);    printf("%s\n", crypt_text);    free(clear_text);    free(crypt_text);    return 0;}