Search code examples
c++if-statementencryptioncaesar-cipher

If Statement not working, input unrecognised (C++)


My program runs without issues, compiles no errors.

The aim of my if statement is to choose if letters are shifted left/right which I have tried to achieve with an if statement leading to 2 functions, however no matter the input from cin >> z; it will always utilize CipherR. Can anyone help me figure this out?

//Start of Document

#include <WinUser.h>                //Gives access to windows form library
#include "StdAfx.h" //Standard prefix for vb to save 
#include <iostream> //Enables I/O stream cin/cout 
#include <string>   //Ensures that string data can be assigned 
#include <Windows.h>    //Gives access to windows library Included libraries, above <winuser.h>
using namespace std;

//Variables

char cipherR(char);
char cipherL(char);
int y;
const string LEFT = "1";
const string RIGHT = "0";


//Main Code
int main()
{
    string input;   //Declares string variable for temp storage

                    //MessageBox
    int WinUserMessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT       uType);      //defines MessageBox parameters
    const int message = MessageBox(NULL, L"Is your location    secure?", L"Warning", MB_YESNOCANCEL);       //sets up listener for messagebox   response

                                                                                                            //Switch Response
    switch (message)                                //Initialise case study
    {
    case IDYES:                                 //Runs this if Yes is selected

                                                //cipher code block
        do {
            cout << "Enter text to be ciphered/deciphered." << endl;
            cout << "Enter blank line to quit." << endl;
            getline(cin, input);                            //Prompts for User   Input, stores into temporary var
            string output = "";                             //Checks for blank input

            cout << "Shift Left(1) or Right(0)? \n";
            string z;               //L or R definer

            std::cin >> z;
            cout << "Enter number to shift\n";
            cin >> y;
            if (z == LEFT)
            {
                for (int x = 0; x < input.length(); x++)        // Loops until string.length is reached.
                {
                    output += cipherR(input[x]);
                }
            }                       //Adds the value of expression to the value of a variable and assigns the result to the variable.
            else if (z == RIGHT)
            {
                for (int x = 0; x < input.length(); x++)        // Loops until string.length is reached.
                {
                    output += cipherL(input[x]);        //Adds the value of expression to the value of a variable and assigns the result to the variable.
                }
            };

            cout << output << endl;         // If input is blank will end process
        } while (!input.length() == 0);     //Loops while input.length is NOT equal to 0
        break;

        //alternate message responses
    case IDNO:              //Runs this if No is selected
        MessageBox(NULL, L"Agents are converging on your location now.", L"Run!", NULL);
        return 0;
        break;
    case IDCANCEL:      //Runs this if cancel is selected
        MessageBox(NULL, L"Why open this is you're gonna back out?", L"Alert", NULL);
        return 0;
        break;
    }

}

//functions
char cipherR(char c)        //function caesar, called into main
{
    if (isalpha(c))     //checks if is part of the alphabet
    {
        c = toupper(c);     //ignores casing of input for universal input
        c = (((c - 65) + y) % 26) + 65;     //performs caesar cipher with algebraic equation
        return c;                           //returns encrypted data
    }
    if (!isalpha(c))        //if is not alphabetic will make blank
    {
        return 0;           //returns blank
    }
    //  if c isn't alpha, just send it back

}

char cipherL(char c)        //function caesar, called into main
{
    cout << "This Is left";
    if (isalpha(c))     //checks if is part of the alphabet
    {
        c = toupper(c);     //ignores casing of input for universal input
        c = (((c - 65) - y) % 26) + 65;     //performs caesar cipher with algebraic equation
        return c;                           //returns encrypted data
    }
    if (!isalpha(c))        //if is not alphabetic will make blank
    {
        return 0;           //returns blank
    }
    //  if c isn't alpha, just send it back

}

//end of sheet

Solution

  • I believe you have your functions swaped. In

    if (z == LEFT)
    {
        for (int x = 0; x < input.length(); x++)        // Loops until string.length is reached.
        {
            output += cipherR(input[x]);
        }
    }                       //Adds the value of expression to the value of a variable and assigns the result to the variable.
    else if (z == RIGHT)
    {
        for (int x = 0; x < input.length(); x++)        // Loops until string.length is reached.
        {
            output += cipherL(input[x]);        //Adds the value of expression to the value of a variable and assigns the result to the variable.
        }
    };
    

    When you go into the "left" if statement you are calling cipherR() when you should be calling cipherL(). You also need to fix "right" as you are calling cipherL(). Fixed version:

    if (z == LEFT)
    {
        for (int x = 0; x < input.length(); x++)        // Loops until string.length is reached.
        {
            output += cipherL(input[x]);
            //              ^ L here
        }
    }                       //Adds the value of expression to the value of a variable and assigns the result to the variable.
    else if (z == RIGHT)
    {
        for (int x = 0; x < input.length(); x++)        // Loops until string.length is reached.
        {
            output += cipherR(input[x]);        //Adds the value of expression to the value of a variable and assigns the result to the variable.
            //              ^ R here
        }
    };