0

I was able to make a program that has a menu on it. At first, the program is running smoothly. The problem starts to appear when, at a certain point in the program, the user starts inputting something and then navigating the menus again.

Sometimes it will print out integers/characters that were previously entered by the user when pressing the ENTER key in the menu.

I managed to block the inputs with cin.ignore(). But how can I eliminate the display of the (I don't know if its excess or garbage) inside the input buffer whenever the user presses the LEFT and RIGHT arrow keys? Or I think there's even one for UP and DOWN arrow key?

int main()
{
    color(FG_WHITE);
    bool progFinished = false;
    while (!progFinished) {
        cout << "[ACTIVITY FOR 26 FEBRUARY 2018]\n";
        vector<string> menu = { "Currency Converter","Student Information System" };
        int choice = menu_std(menu, FG_YELLOW, false);
        bool currencyFinished = false;
        bool studentFinished = false;
        switch (choice) {
        case 0:
            while (!currencyFinished) {
                cout << "\n\n[CURRENCY CONVERT]\n";
                vector<string> curr_menu = { "PHP TO OTHERS","USD TO PHP","YEN TO PHP","EUR TO PHP","BHD TO PHP" };
                int currency = menu_std(curr_menu, FG_YELLOW, false);
                double value = validation("\nEnter the value", 0, false);
                CurrencyConverter convert(currency, value);
                cout << "\n\nConvert again? ";
                currencyFinished = !menu_yn(FG_YELLOW);
            }
            system("cls");
            break;
        case 1:
            Studentv2 stud;
            stud.LoadFile();
            while (!studentFinished) {
                cout << "\n\n[STUDENT INFO SYSTEM]\n";
                vector<string> stud_menu = { "Add Student","View All Students" };
                int stud_choice = menu_std(stud_menu, FG_YELLOW, false);
                switch (stud_choice) {
                case 0:
                    stud.AddStudent();
                    cout << "\n\nDo you want to continue with the Student Info System? ";
                    stud.SaveFile();
                    studentFinished = !menu_yn(FG_YELLOW);
                    break;
                case 1:
                    stud.DisplayStudentInformation();
                    cout << "\n\nDo you want to continue with the Student Info System? ";
                    studentFinished = !menu_yn(FG_YELLOW);
                    break;
                }
            }
            system("cls");
            break;
        }
        cout << "\nContinue using the program? ";
        progFinished = !menu_yn(FG_YELLOW);
        system("cls");
    }
    cout << "Press any key to exit.\n";
    cin.get();
    return 0;

}

Code snippets for some of the functions I used inside my program. Function menu_std():

int menu_std(std::vector<std::string> &menu, WORD atrribute, bool argument)
{
    sleep_for(milliseconds(150));
    int elements = menu.size();
    int elements_max_size = menu.size() - 1;
    int menu_position = 0;
    COORD position = getcoordinates();
    while (true) {
        for (int i = 0; i < elements; i++) {
            move(position.X, position.Y + i);
            if (i == menu_position) {
                color(atrribute);
                std::cout << menu[i];
                color(FG_WHITE);
            }
            else {
                std::cout << menu[i];
            }
        }
        while (true) {
            if (GetAsyncKeyState(VK_UP) < 0 && menu_position != 0) {
                menu_position--;
                break;
            }
            if (GetAsyncKeyState(VK_DOWN) < 0 && menu_position != elements_max_size) {
                menu_position++;
                break;
            }
            if (GetAsyncKeyState(VK_RETURN) < 0) {
                std::cin.ignore(10000, '\n');
                if (argument == true) {
                    sleep_for(milliseconds(100));
                    COORD previous = getcoordinates();
                    std::cout << "\n\nAre you sure? ";
                    bool sure = menu_yn(atrribute);
                    if (sure) {
                        clear_output(previous);
                        return menu_position;
                    }
                    else {
                        clear_output(previous);
                        break;
                    }
                }
                else {
                    return menu_position;
                }
            }
            sleep_for(milliseconds(50));
        }
        sleep_for(milliseconds(175));
    }
}

Function menu_yn():

bool menu_yn(WORD attribute)
{
    sleep_for(milliseconds(150));
    COORD currentpos = getcoordinates();
    int pos = 0;
    while (true) {
        move(currentpos);
        switch (pos) {
        case 0:
            color(attribute);
            std::cout << "YES";
            color(FG_WHITE);
            std::cout << " NO";
            break;
        case 1:
            std::cout << "YES";
            color(attribute);
            std::cout << " NO";
            color(FG_WHITE);
            break;
        }
        while (true) {
            if (GetAsyncKeyState(VK_RIGHT) < 0 && pos != 1) {
                pos++;
                break;
            }
            if (GetAsyncKeyState(VK_LEFT) < 0 && pos != 0) {
                pos--;
                break;
            }
            if (GetAsyncKeyState(VK_RETURN) < 0) {
                std::cin.ignore(10000, '\n');
                if (pos == 0) {
                    return true;
                }
                else if (pos == 1) {
                    return false;
                }
            }
        }
        sleep_for(milliseconds(175));
    }
}

Function validation()

double validation(std::string question, double limit, bool argument)
{
    double userInput;
    while (true) {
        std::cout << question << " >> ";
        while (!(std::cin >> userInput)) {
            std::cout << "Error: Non-integer input. " << question << " >> ";;
            std::cin.clear();
            std::cin.ignore(256, '\n');
        }
        std::cin.ignore(10000, '\n');
        while (userInput > limit && limit != 0) {
            std::cout << "Error: Input out-of-bounds. " << question << " >> ";
            std::cin >> userInput;
            std::cin.ignore(10000, '\n');
        }
        if (argument) {
            return (userInput <= 0) ? 1 : userInput;
        }
        else {
            return userInput;
        }
    }
}

Screenshot of the problem:

screenshot of the problem

There are numbers appearing whenever I press enter on the menu. I suspect that it comes whenever the user presses the arrow keys before entering the enter.

cbuchart
  • 10,847
  • 9
  • 53
  • 93
Ryon
  • 23
  • 4
  • You want to activate on a *key press*. You should search the internet for "MSDN C++ read key press" or "MSDN c++ detect keypress". The "MSDN" is abbreviation for Microsoft Developers Network. – Thomas Matthews Feb 27 '18 at 17:02
  • No. I am successful with activating a key press. What I want to know now is how can I eliminate the previous inputs from appearing whenever I press the arrow keys. – Ryon Feb 28 '18 at 02:36
  • Try looking at `std::cin.ignore()`. – Thomas Matthews Feb 28 '18 at 16:10

0 Answers0