c++ cin.ignore() JÄVLIGT irriterande problem!

Permalänk
Medlem

c++ cin.ignore() JÄVLIGT irriterande problem!

Hej forumet!

Jag har stött på ett rejält irriterande problem och jag skulle uppskatta om nån smartare person än mig kunde hjälpa till

Jag har försökt lösa problemen som uppstår om man skriver in en bokstav istället för en int.

här följer ett lite förenklat exempel från mitt program. (köpval är av typen int)

cout << "ange nr på varan du vill ha: "; cin >> köpval;

i mitt program finns max 8 varor att välja på och det va inga problem att hantera fel som uppstår om man skulle välja ett nr utanför
intervallet 1-8. MEN om jag skulle skriva in en bokstav istället för en int så får jag en oändlig loop.
så jag prövade att göra så här:

cout << "ange nr på varan du vill ha: "; cin >> köpval;
while(!(cin>>köpval) ||cin.peek() != '\n' || köpval < 1 || köpval > 8)
{
cin.clear();
cin.ignore();
cout << "Ange nr på varan du vill ha: ";
}

jag lyckades få det att funka på det sättet att programmet inte hänger sig om man matar in en char istället för en int. MEN programmet skippar nu korrekt input.
så om jag väljer en vara som finns så måste jag mata in numret 2 gånger istället. jag gissar på att det är pga cin.ignore() men tar jag bort det så är jag tillbaka på en oändlig loop igen. sjukt irriterande problem alltså.

så om det finns en vis programmerare där ute så snälla säg vad jag för för fel!

mvh - johan

Permalänk
Medlem

Blir inte riktigt klok på den där while satsen.
testa något enklare kanske ?

int myNumber; cout << "skriv in ett tal: " ; while (true) { if (cin >> myNumber) // gick det att för över talet? break; cin.clear(); // ta bort error stats cin.ignore(100,'\n'); // ignorera 100 chars eller tills den hittar \n cout << endl << "inget tal testa igen: "; // error uppmaning }

kanske lite för mycket av att ge dig lösningen men vet inte riktigt hur jag ska förklara bättre.
Du får där emot bygga in att den kontrollerar numret av köpvalet själv det får att fixa ganska lätt,

Visa signatur

orka

Permalänk
Medlem

Jag lyckades knäcka den där. använde cin.fail() å då funkade det tydligen. tack för hjälpen iallafall och ursäkta kodröran!

Permalänk
Medlem

cout << "Ange val: ";
cin>>val;
cin.ignore();

while(!cin)
{
cin.clear();
cin.ignore();
cout << "Ange val med siffra: ";
cin>>val;
cin.ignore();
}

Sen jämför valet med if-satserna. Detta är en enkel lösning för att inte programmet skall balla ur om man råkar skriva in en bokstav. Annars finns det bättre men mer avancerade.