Een beperkt aantal karakters uit de invoerbuffer halen

Status
Niet open voor verdere reacties.

cerium

Gebruiker
Lid geworden
30 jan 2007
Berichten
13
Hallo

Ik programmeer nog niet zo lang met C++ en ik heb een probleem. Ik wil de gebruiker een willekeurig getal laten invoeren. Maar dit getal moet van het type int zijn. Nu is het zo dat de gebruiker maar al te makkelijk een getal kan intypen dat buiten het bereik van int ligt. Mijn idee was om misschien slechts een beperkt aantal karakters uit de invoerbuffer te halen, conform aan het bereik van int. De cijfers die teveel ingegeven zijn worden dus niet meegenomen in het verdere verloop van het programma.

Is dit mogelijk, of zijn er betere manieren om het programma hiertegen te beveiligen?

Alvast bedankt
 
Code:
int i;
if (cin >> i)
    cout << "i is een int" << endl;
else
     cout << "ongeldige invoer" << endl;

--Johan
 
inderdaad,
dit beveiligt zowel tegen invoer van andere tekens als invoer van te grote getallen

--Johan
 
Hoe komt het eigelijk dat dit werkt. Worden extraction en insertion statements ook aanzien als een logische functie? M.a.w controleert C++ op voorhand of hetgene wat er ingevoerd wordt overeenstemt met het type variabele?

Want als je bijvoorbeeld een getal zoals 131654987654321654987654321657497 in een int-variabele probeert te stoppen, dan lukt dit toch. Je zal een negatief getal krijgen of een getal dat nergens op slaat maar je krijgt een getal dat binnen de grenzen van int ligt.

Volgens mij zal C++ controleren of hij je invoer heeft moeten aanpassen aan de grenzen van int. Als dit zo is krijgt de statement " cin >> iGetal " de waarde false.

Klopt mijn redenering?
 
Je gaat naar mijn gevoel de juiste richting uit, maar het klopt nog niet helemaal, denk ik.
Ik ben geen programmeergoeroe, maar dit is wat ik ervan begrijp:

cin is een invoerbuffer. Dit wil zeggen dat alles wat je intikt via het toetsenbord daarin terechtkomt, of je het nu nodig hebt of niet. Op het moment dat jij de stream-operator >> gebruikt, wordt gekeken of er iets in de buffer zit en mimum het eerste teken eruitgehaald. Als de buffer leeg is wordt op een invoer gewacht.

Ik vermoed dat de buffer als char* kan aanzien worden, waardoor alles wat jij binnenkrijgt eigenlijk een char is. Dan wordt naar het type van de variabele gekeken, en wordt geprobeerd om het karakter naar het correcte type te converteren. Als dit mislukt geeft de volledige operatie de waarde false weer. Als de omzetting slaagt is de returnwaarde gelijk aan de ingelezen waarde, wat verschillend is van false, en daardoor true.
Zolang de tekens in de invoerbuffer voldoen aan het type van de variabele die je wil, worden ze eruit gehaald, de rest blijft achter.

Ik zie het inlezen ook als een vereenvoudigde methode om een methode van een bepaalde klasse uit te voeren. Een mogelijke notatie van 'cin >> i' voluit zou dan zoiets geven:
Code:
cin.insertInto(i);


Deze code kan mss wat meer duidelijkheid over het gedrag van de buffer aan het licht brengen:
Code:
#include <iostream>
using namespace std;

int main()
{
    int i = 2;
    bool gelukt = false;
    string rest = "";
    cout << endl << "Geef een int (exit stopt): ";
    while (!gelukt) {
        if (cin >> i) {
            //inlezen lukte
        } else {
            //de inleesopdracht annuleren
            cin.clear();
        }
        //rest uit de buffer halen, eerst kijken of er nog iets inzit
        if (cin.peek())
            getline(cin, rest, '\n');
        //resultaat afdrukken
        cout << "waarde van i = " << i << endl
             << "rest van de buffer = '" << rest << "'" << endl;
        if (rest != "exit")
            cout << endl << "Geef een int (exit stopt): ";
        else
            gelukt = true;
    }
    return 0;
}

--Johan
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan