-
-
Save CraigRodrigues/100ab759b6b6722ba3ad8acf12e26371 to your computer and use it in GitHub Desktop.
#include <stdio.h> | |
#include <cs50.h> | |
#include <string.h> | |
#include <ctype.h> | |
/** | |
* Caesar.c | |
* A program that encrypts messages using Caesar’s cipher. Your program must | |
* accept a single command-line argument: a non-negative integer. Let’s call it | |
* k for the sake of discussion. If your program is executed without any | |
* command-line arguments or with more than one command-line argument, your | |
* program should yell at the user and return a value of 1. | |
* | |
* */ | |
int main(int argc, string argv[]) | |
{ | |
// check for 2 arguments only | |
if (argc != 2) | |
{ | |
printf("Nope\n"); | |
return 1; | |
} | |
// once I check for correct argv put key into an int k | |
int k = atoi(argv[1]); | |
// check if the integer is non-negative | |
if (k < 0) | |
{ | |
printf("Nope\n"); | |
return 1; | |
} | |
else | |
{ | |
// prompt user for a code to encrypt | |
string code = GetString(); | |
for (int i = 0, n = strlen(code); i < n; i++) | |
{ | |
//check if the letter is uppercase or lowercase then convert | |
if islower(code[i]) | |
printf("%c", (((code[i] + k) - 97) % 26) + 97); | |
else if isupper(code[i]) | |
printf("%c", (((code[i] + k) - 65) % 26) + 65); | |
//if neither then just print whatever it is | |
else | |
printf("%c", code[i]); | |
} | |
printf("\n"); | |
return 0; | |
} | |
} |
Steps:
- Get a single command-line argument "key" from the user that is a non-negative integer.
- If not a single argument then yell at user.
- Take the "key" and turn it into an int with atoi since it starts as a string.
- Prompt user for a code they want to encrypt.
- Need to loop through the entire code letter by letter.
- Check if each letter is either lowercase, uppercase or neither.
- Standardize the ASCII value of the char to 26 then add the key. Then convert back into ASCII so that the code can wrap around properly.
- If neither a lowercase or uppercase letter then just print whatever the char is. This allows for spaces or special characters like ! or &.
- Once all of the above is complete print a new line.
- Return 0.
Notes:
- Checking if the argv[1] was a non-negative integer (don't think I even needed to do this).
- Figuring out how to standardize ASCII to the regular alphabet then converting back took a lot of time.
- This ASCII chart was incredibly useful - http://www.kerryr.net/pioneers/ascii3.htm
- Trying to put argv[1] into a variable before I check if there is even an argv[1] caused a segmentation fault.
- Didn't notice that toupper/tolower already checks if the character is a letter. First I had two more checks to see if the character was a letter or not when that wasn't necessary.
- ctype.h library is very useful - https://cs50.harvard.edu/resources/cppreference.com/stdstring/all.html
What if the user enters an alphabet instead of a number in place of key?
Guys I'm getting this:
:) caesar.c exists.
:) caesar.c compiles.
:( encrypts "a" as "b" using 1 as key
expected "ciphertext: b...", not "ciphertext: b..."
:( encrypts "barfoo" as "yxocll" using 23 as key
expected "ciphertext: yx...", not "ciphertext: yx..."
:( encrypts "BARFOO" as "EDUIRR" using 3 as key
expected "ciphertext: ED...", not "ciphertext: ED..."
:( encrypts "BaRFoo" as "FeVJss" using 4 as key
expected "ciphertext: Fe...", not "ciphertext: Fe..."
:( encrypts "barfoo" as "onesbb" using 65 as key
expected "ciphertext: on...", not "ciphertext: on..."
:( encrypts "world, say hello!" as "iadxp, emk tqxxa!" using 12 as key
expected "ciphertext: ia...", not "ciphertext: ia..."
:) handles lack of argv[1]
:) handles non-numeric key
:) handles too many arguments
but the output match.... Any idea?
idk
i'm also getting thi with similiar code
were u able to do it?
as you can see it's way too long lol