Problèmes d'analyse d'entrée

Quand un utilisateur entre des espaces entre les chiffres pour créer une chaîne de référence, il rejette tout et va même porter des numéros à la prochaine cin. Si toutefois ils ont des lettres entre et pas d'espaces cela fonctionne bien. L'affectation était pour une simulation de remplacement de page.

Code (c'est seulement la partie du code qui devrait affecter mon problème):

void main()
{
    bool again = false;
    bool reuse = false;
    bool valid;
    int use;
    int refLength;
    vector ref(0);
    vector
 frames(0);
    string refString;
    string user;

    //ask how long the user wants the ref string to be
    do{
        valid = false;
        while (!valid&&!reuse)//take choice of ref string
        {
            cout << "How long do you wish the reference string to be? ";
            if (!(cin >> refLength))
            {
                cin.clear();//.clear and .ignore keep cin from errors and forced infinite loop repeating following cout
                cin.ignore(numeric_limits::max(), '\n');
                cout << "The length must be enter as an integer value between ";
                valid = false;

            }

            else
            {
                cout << "You have chosen to have a Ref string of " << refLength << " length " << endl;
                valid = true;
            }
        }
        valid = false;

        while (!valid&&!reuse)
        {
            cout << "Do you want to enter a ref string or randomly generate one" << endl;
            cout << "of your chosen length? Enter 1 to generate and 2 to input the string ";
            if (!(cin >> use) | (use<0 || use>2))
            {
                cin.clear();//.clear and .ignore keep cin from errors and forced infinite loop repeating following cout
                cin.ignore(numeric_limits::max(), '\n');
                cout << "You must enter an integer between 1 and 2";

            }
            else
            {
                valid = true;
                if (use == 1)
                {
                    make(ref, refLength);
                }
                else
                {
                    cout << "please enter a ref string of chosen length entering" << endl;
                    cout << "fewer digits will cause 0's to be added. Entering more" << endl;
                    cout << "will cause those past the chosen length to be dropped " << endl;
                    cout << "any letters will be ignored but spaces throw things off" << endl;
                    cout << "Also all entries must be single digit integers (0-9) " << endl;
                    cin >> refString;
                    make(ref, refLength, refString);
                }
                use = 0;
            }

        }
        cout << endl;
        /*for(int i=0;i<<<" ";
        }*/
        valid = false;
        while (!valid)
        {
            cin.clear();
            //errors ********************************************88
            cout << "How many frames do you want (1-7) ";
            if (!(cin >> use) | (use<0 || use>7))
            {
                cin.clear();
                cin.ignore(numeric_limits::max(), '\n');
                cout << "You must enter an integer between 1 and 7 ";
                valid = false;
            }
            else
            {
                valid = true;
                setUpFrames(use, frames);
                use = 0;
            }
        }
        valid = false;
        while (!valid)
        {
            cout << "Enter 1 for FIFO or 2 for LRU pageRep algo or 3 for Optimal";

            if (!(cin >> use) | (use<0 || use>3))
            {
                cin.clear();
                cin.ignore(numeric_limits::max(), '\n');
                cout << "Must be int between 1 and 3";
            }
            else if (use == 1)
            {
                cout << endl << "# of Page Faults ";
                cout << FIFO(ref, frames);
                valid = true;
            }
            else if (use == 2)
            {
                cout << endl << "# of Page Faults ";
                cout << LRU(ref, frames);
                valid = true;
            }
            else
            {
                cout << endl << "# of Page Faults ";
                cout << Optimal(ref, frames);
                valid = true;
            }

        }
        cout << endl;
        cout << "do you want to try again ? Enter y for yes anything else for no" << endl;
        cin >> user;
        if (user == "y")
        {
            again = true;
            cout << "do you want to use the same reference string? y for yes anything else for no" << endl;
            cin >> user;
            if (user == "y")
            {
                reuse = true;
            }
            else
            {
                reuse = false;
            }
        }
        else
        {
            again = false;
        }    
    } while (again);    
}
0
Pouvez-vous réduire cela à un exemple plus compact qui démontre votre problème?
ajouté l'auteur Barmar, source
C'est beaucoup trop de code pour montrer votre problème. En général, cependant, si vous avez besoin d'analyser l'entrée de l'utilisateur, vous devez utiliser getline et analyser la chaîne d'entrée plutôt que de compter sur les utilisateurs pour obtenir les détails du format d'entrée.
ajouté l'auteur Pete Becker, source
Mon conseil immédiat serait de décomposer ceci en fonctions sensibles. À l'heure actuelle, vous avez du code pour obtenir des paramètres de l'utilisateur mélangés de manière aléatoire avec le code de simulation, ce qui rend presque impossible de suivre l'un ou l'autre.
ajouté l'auteur Jerry Coffin, source
Avez-vous le déboguer? Et plz n'utilisez pas d'onglets dans le code posté ici!
ajouté l'auteur πάντα ῥεῖ, source

1 Réponses

Si vous voulez un mot d'interaction cin/cout/ligne par mot/ligne, utilisez getline, sinon la confusion apparaîtra.

0
ajouté
Ah, allez lui donner un court échantillon de 3 lignes ...
ajouté l'auteur πάντα ῥεῖ, source