Archief - [PROG][C++] Probleem met 'cin'

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

nickman

Legacy Member
Hey,
Ik ben nog niet zo lang bezig met C++, maar heb net een kleine interface (text based) voor mijn programma geschreven.
Nu heb ik een "menu" gemaakt en dan wordt er via 'cin' gevraagd om een getal is te geven (1-4 stellen menu keuzes voor).

Nu alles werkt perfect, maar, als je nu bv de letter 'a' zou ingeven ipv een getal, dan gaat heel de boel flippen, het venster blijft dan continu refreshen...

Hier is een stukje van de code:
Code:
int main(int argc, char *argv[])
{
    int menu = 0;
    bool sorted = 0;
    SortedList * Lijst = new(SortedList);
    
    do
    {
		system("cls");
		cout << " Maak u keuze : ";
		cin  >> menu;

		cout << endl << endl;
		
		if (menu == 1)
		{
		}
		else if (menu == 2)
		{
		}
    }	
    while (menu != 4);

dus als ik de keuze 4 ingeef dan laat ik het programma gewoon stoppen.
Tussen die code zit nog een hele hoop output, maar die is toch niet belangrijk :).

Heeft er iemand enig idee hoe ik dit zou kunnen tegengaan?
Ik heb ge probeerd met een if structuur om te zien dat de keuze wel degelijk tss 0 en 5 lag, maar dat hielp dus niet...

voor degene die het graag eens wil proberen:
http://users.pandora.be/nickman/SortedList.exe
(werkt enkel op windows)

greetz,
Nick

Tyfius

Legacy Member
't is lang geleden da ik nog C++ gedaan heb, maar der staat mij iets bij van:
Code:
int i;
do
{
  cin >> i;
}
while (cin.good() == false);

nickman

Legacy Member
Heb het net even geprobeerd en dan blijft hij gewoon steken nadat ik een 'a' heb ingelezen :s.
Dan moet ik onderbreken met Ctrl + c ...

Toch al bedankt...

Deguchi

Legacy Member
Code:
switch(menu)
{
case 1: //doe iets ;
break;
case 2: //doe iets anders ;
break;
default: //als de waarde niet 1 of 2 is doe dan iets of niets ;
break;
}

Dus een switch - case zal enkel checken of de variabele die ge aan switch meegeeft voldoet aan 1 van de case waarden. Als die er niet aan voldoet zal de default functionaliteit uitgevoerd worden.
De break; die er telkens bijstaat dient ervoor dat als menu bijvoorbeeld de waarde 1 heeft, hij na het uitvoeren van de functionaliteit bij case 1 hij uit de switch zal gaan. Indien dit niet gewenst is, en de variabele menu ook nog op andere moet worden gecontroleerd, dan laat ge de break; weg ;)

nickman

Legacy Member
Heb het net toegepast (terwijl dit identiek is aan mijn if structuur, alleen op een andere manier geschreven) en geeft net het zelfde...
Je moet maar is het programma binnehalen en als menu keuze 'a' ofzo opgeven, dan begtint hij constant uit te printen en ik weet niet waarom...
als ik een foutief getal zou ingeven, dan gaat het wel goed...

killgore

Legacy Member
char menu = 0;

:sop:

edit: wat uitleg :p:

Als jij cin >> int doet dan gaat je cin een beetje in de problemen komen als hij een charakterteken ontvangt. Je kan ofwel proberen je cin compleet te resetten (en dat is niet altijd zo evident :p) of je kan gewoon werken met characters, waar cin nu eenmaal voor gemaakt is.

Dan doe je gewoon
if(menu=='1') ipv 1, helemaal hetzelfde resultaat :).

Let wel: dit leest 1 teken tegelijk in!
Als jij iets typt als "1111111", zal hij automatisch je loop 7 keer doorlopen :), elk teken 1 voor 1 doorlopen.
Als je dat niet wilt moet je met strings ipv chars gaan werken (en met cin.getline dan). Dat is niet zoveel moeilijker ;).

edit2:
De code dus als je echt int menu wilt gebruiken:
Code:
cin  >> getal;
if(!cin.good())
{
    cin.clear();cin.ignore();
}

Die werkt volgens mij, let wel: clear en ignore niet omdraaien.

of in macrovorm:
Code:
#define CININT(n) std::cin  >> n; \
	if(!std::cin.good()) \
		{ \
		    std::cin.clear(); \
                    std::cin.ignore(); \
		} \

Maar zoals ik zei: cin buffer cleaning kan soms nogal een ramp zijn, dit is volgens mij oplossing (was allessinds diegene die in mijn libs stond) maar of ze echt compleet is: dnno.

Devroush

Legacy Member
mebbe nog kleine opmerking, als ge als waarde een woord typt, zal em ook meerdere keren vragen om iets nieuws in te typen

nickman

Legacy Member
ja, dat heb ik al gemerkt.
weet nog niet hoe ik dat ga oplossen... :)

killgore

Legacy Member
Nu ja, op andere platforms (andere als windows) zal je niet \n maar \r\n of \r moeten gebruiken.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan