यहाँ मेरा थोड़ा सा कोड है। असल में, मेरे मुख्य में मैं उपयोगकर्ता को इस चयनकर्ता मेनू में भेज रहा हूं। जब उपयोगकर्ता चयन करता है, तो मैं मुख्य पर वापस जा रहा हूं और फिर उन्हें आगे के कार्यों को करने के लिए उपयुक्त कक्षा में भेज रहा हूं।

उदाहरण के लिए, जब उपयोगकर्ता "भेजें" का चयन करता है, तो वे मुख्य में पास हो जाते हैं और फिर एक फ़ंक्शन में पास हो जाते हैं जो इनपुट एकत्र करता है कि कहां भेजना है। फिर वापस मुख्य पर, फिर वापस एक समारोह में जो उनसे पूछता है कि कितना। यह पहली बार ठीक काम करता है।

समस्या यह है कि यदि वे एक और लेनदेन भेजने का प्रयास करते हैं, तो यह स्वचालित रूप से पहले दर्ज की गई राशि के साथ पता भर देता है। उपयोगकर्ता को इसे स्वयं कंसोल लाइन से हटाना होगा। मूल रूप से, राशि सिनेमा बफर में फंस रही है और स्वचालित रूप से चर भर रही है। मैंने गेटलाइन का उपयोग करने की कोशिश की है, और इसमें एक ही समस्या है। मैं cin.clear() और cin.ignore(1000,'\n') का उपयोग करके सिने बफर को साफ़ करने के लिए एक छोटे से फ़ंक्शन का उपयोग कर सकता हूं और यह मेरी समस्या को ठीक करता है, लेकिन फिर उपयोगकर्ता को इनपुट करने के बाद एक अतिरिक्त समय दर्ज करना पड़ता है।

मैंने समस्या को मेनू में अलग कर दिया है। जब मैं अपने कार्यक्रम से मेनू को बाहर करता हूं, तो समस्या गायब हो जाती है। मेनू एक कार्य प्रगति पर है, मुझे पता है कि यह सुंदर या पॉलिश नहीं है। मैं यह नहीं समझ सकता कि यह ऐसा क्यों कर रहा है। कृपया मदद करें, मैं अपने बाल काटने वाली हूँ।

साथ ही, समस्या कोड के if(refresh){...} भाग में नहीं है, मैंने इसे बाहर करने का प्रयास किया है और समस्या बनी रहती है।

मेनू हेडर फ़ाइल में बस कुछ निजी चर और वेक्टर घोषणाएं हैं। अनुरोध पर अतिरिक्त कोड पोस्ट करने में मुझे खुशी होगी।

मेनू.सीपीपी

#include "menu.h"
#include "KMD_COMMANDS.h"
#include <windows.h>

std::string menu::userInterface()
{
    KMD_COMMANDS displayInfo;

    bool selecting = true;  //
    refresh = true;         //
    numRight = 3;           //reset variables back to default
    options = oDWB;         // < string vector

    system("cls");

    hideCursor();
    while(selecting)
    {
        numLeft = 3 - numRight;     //sets the number of left movements available

        if(refresh)   //only refresh the screen when user makes an input. I plan to use a console vector updating method in the future instead of "cls"... I know "cls" sucks
        {
            system("cls");

            std::cout << "Balance: ";
            displayInfo.getBalance();
            std::cout<<std::endl;
            std::cout << "Public Address: ";
            displayInfo.getPubKey();
            std::cout<<std::endl;

            for(int i = 0; i < options.size(); i++)
            {
                std::cout << options[i];
            }

            refresh = false;    //refresh is done
        }

        Sleep(100);     //this makes a delay so inputs are less sensitive

        if(GetAsyncKeyState(VK_RIGHT))
        {
            refresh = true;     //reset refresh variable so console updates

            switch(numRight)    //moves the selector around
            {
                case 1:
                    numRight--;
                    options = optionsDefault;   //sets the options selector
                    options[12] = "[";          //back to default state
                    options[14] = "]";          //and moves brackets
                    break;
                case 2:
                    numRight--;
                    options = optionsDefault;
                    options[8] = "[";
                    options[10] = "]";
                    break;
                case 3:
                    numRight--;
                    options = optionsDefault;
                    options[4] = "[";
                    options[6] = "]";
                    break;
                default:
                    break;
            }
        }

        if(GetAsyncKeyState(VK_LEFT))    //moves the selector around
        {
            refresh = true;

            switch(numLeft)
            {
                case 1:
                    numRight++;
                    options = optionsDefault;
                    options[0] = "[";
                    options[2] = "]";
                    break;
                case 2:
                    numRight++;
                    options = optionsDefault;
                    options[4] = "[";
                    options[6] = "]";
                    break;
                case 3:
                    numRight++;
                    options = optionsDefault;
                    options[8] = "[";
                    options[10] = "]";
                    break;
                default:
                    break;
            }
        }

        if(GetAsyncKeyState(VK_UP))     //takes users selection (changed to up for debugging purposes)
        {
            switch(numRight)    //takes selection choice based from number of right inputs remaining
            {
                case 1:
                    userChoice = "send";
                    return userChoice;
                    break;
                case 2:
                    userChoice = "unlock";
                    return userChoice;
                    break;
                case 3:
                    userChoice = "lock";
                    return userChoice;
                    break;
                default:
                    userChoice = "quit";
                    return userChoice;
                    break;
            }
        }
    }
}

यहां वह जगह है जहां उपयोगकर्ता को जानकारी एकत्र करने के लिए पास किया जाता है, जहां सिन स्थित हैं:

#include "confirmSend.h"

#include <iostream>
#include <windows.h>

std::string confirmSend::sendToAddress()
{
    Sleep(100);     //delay so user doesn't accidentally input twice

    bool confirm = false;
    std::string addressInput;
    while(!confirm)
    {
        //std::cin.clear();
       // std::cin.ignore(1000,'\n');

        system("cls");
        std::cout << "Type cancel to cancel..." << std::endl;
        std::cout<<std::endl;
        std::cout << "Enter the address of where to send: ";
        std::cin >> addressInput;
        Sleep(800);
       // std::cout<<std::endl;

        confirm = true;
    }

    return addressInput;
}

int confirmSend::sendAmount()
{
    Sleep(100);     //delay so user doesn't accidentally input twice

    bool confirm = false;
    int amount;

    while(!confirm)
    {
       // std::cin.clear();
       // std::cin.ignore(1000,'\n');

        system("cls");
        std::cout << "type 0 to cancel..." << std::endl;
        std::cout<<std::endl;
        std::cout << "Enter how much to send:" << std::endl;
        std::cin >> amount;
        std::cout << std::endl;

        confirm = true;
    }

    return amount;
}
1
Picle Wicle 3 मार्च 2019, 23:24

1 उत्तर

सबसे बढ़िया उत्तर

प्रत्येक के बाद std::cin इनपुट किया गया है और फिर "एंटर" पर क्लिक करें, सिने बफर में एक '\n' बचा होगा, और आपको इसे खत्म करने के लिए कुछ विधि की आवश्यकता होगी। यदि केवल '\n' या अन्य हैं, तो getchar() को एक सरल समाधान के रूप में उपयोग करें। और यदि '\n' से पहले और वर्ण हैं, तो आप getline() का उपयोग उन सभी को समाप्त करने के लिए कर सकते हैं जब तक कि यह '\n' न हो जाए।

1
Drake Wu 5 मार्च 2019, 06:23