如果Statement无效,则输入无法识别(C ++)

时间:2015-09-11 12:32:25

标签: c++ if-statement encryption caesar-cipher

我的程序运行没有问题,没有编译错误。

我的if语句的目的是选择是否向左/右移动字母,我试图用if语句导致2个函数,但无论来自cin >> z;的输入,它总是使用CipherR 。任何人都可以帮我解决这个问题吗?

//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

2 个答案:

答案 0 :(得分:0)

我相信你的功能已经发生了变化。在

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.
    }
};

当您进入“左”if语句时,当您应该呼叫cipherR()时,您正在呼叫cipherL()。您还需要在调用cipherL()时修正“正确”。修正版:

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
    }
};

答案 1 :(得分:0)

看起来你认为-1 % 26是25 它不是 - 它是1或-1,具体取决于实现。

在您的实施中,它显然是正面的,因为您在两个班次都得到相同的结果。

左移不能使用模数 相反,使用重复添加:

c = c - y;
while (c < 'A')
{
    c += 26;
}

您还想查看每个案例中您要调用的功能,因为您可以切换它们。