Epic Defeater
Epic Defeater

Reputation: 2147

My decryptor doesn't work

I have created two things for pset2 a caesar cipher encryptor and decryptor. My encryptor works and it is called caesar.c, but my decryptor(decryptor.c) doesn't work and I can't figure out why? Here is my code.

Caesar.c

#include <cs50.h> 
#include <string.h> 
#include <stdio.h> 
#include <math.h> 
#include <stdlib.h> 
#include <ctype.h>
#include <string.h>
#include "encryptorFunction.c"


int main(int argc, string argv[]) {
    //checks for enough args
    if (argc >= 2) {
        //converts the second arg to an integer
        int k = atoi(argv[1]);
        string stringToBeEncrypted = GetString();
        printf("%s\n", encryptor(stringToBeEncrypted, k));
    } else {
        printf("Please add a key argument\n");
        return 1;
    }
}

Decryptor.c

    #include <cs50.h> 
    #include <string.h> 
    #include <stdio.h> 
    #include <math.h> 
    #include <stdlib.h> 
    #include <ctype.h>
    #include "encryptorFunction.c"

    // almost same as caesar


    int main(void) {
         const string stringToBeEncrypted = GetString();
            // string stringToBeEncrypted = GetString();
            //checks all possible decryptions
            for(int k=1;k<26;k++) {
                printf("%s\n", encryptor(stringToBeEncrypted, k));
            }
    }

encryptorFunction.c

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

string encryptor(string encryptString, int key) {
    //loops through every character
    string encryptStringCopy = encryptString;
    for (int i = 0, n = strlen(encryptStringCopy); i < n; i++) {
        //converts the specific char to its ascii value
        int ascii = (int) encryptStringCopy[i];
        //makes key 31 is the same as key 5
        key = key % 26;
        //checks if it is an alphabetical letter
        if (isalpha(encryptStringCopy[i])) {
            //checks if lowercase
            if (islower(encryptStringCopy[i])) {
                //handles the corner case of being z since 26 % 26 is not 26 it's 0
                if ((ascii-96+key) == 26) {
                    ascii = 122;
                }else {
                    //takes the lowercase alphabetical numbers to the 1-26 alphabet then checks mod 26 to cycle back and adds it back.
                    ascii = ((ascii-96+key) % 26) + 96;
                }
                //else part is for uppercase case
            }else {
                //same logic as above
                if ((ascii-64+key) == 26) {
                    ascii = 90;

                }else {
                    ascii = ((ascii-64+key) % 26) + 64;
                }
            }
        }
        //converts the ascii back to a char
        char newChar = (char) ascii;
        //sets the new char into the string
        encryptStringCopy[i] = newChar;
    }
    return encryptStringCopy;
}

Upvotes: 1

Views: 107

Answers (1)

user149341
user149341

Reputation:

Your encryptor() function modifies the input string (the argument encryptString) in place. As a result, calling it repeatedly on the same input will have unexpected results.

That function should create a new string to return, rather than modifying the one it was passed in.

Upvotes: 2

Related Questions