Hulp gevraagd bij het controleren van invoer (C++)

Status
Niet open voor verdere reacties.

ThaMe90

Gebruiker
Lid geworden
28 mei 2008
Berichten
26
Dag allen,

Ik ben voor mijzelf bezig met een C++ projectje, maar nu ben ik bij een vraag aanbeland en ik hoop dat hier iemand mij kan helpen.

Voorgelegd het volgende stukje code:
Code:
int doeActie( int keuze )
{
	int foutMelding = SUCCES;
	float basis = 0,
		hoogte = 0,
		oppervlakte = 0;
	
	switch( keuze )
	{
		case 1: try
				{
					cout << "Lengte vierkant (cm): ";
					cin >> basis;
					cout << endl << "Hoogte vierkant (cm): ";
					cin >> hoogte;
					oppervlakte = basis * hoogte;
					cout << endl << "Oppervlakte vierkant: " << oppervlakte << endl;
				}
				catch( string )
				{
					foutMelding = OPPVIERKANTERROR;
					break;
				}
				break;
	}
	cout << endl;

	return foutMelding;
}

Ik wil tijdens het invoeren van de variabelen (hetzij de basis, hetzij de hoogte) controleren op ingevulde waardes.
Ik bedoel dat wanneer er voor de basis bijv. "abc" wordt ingevoerd, dat de variabele foutmelding wordt aangepast in OPPVIERKANTERROR.
Nu heb ik dit met een try-catch blok geprobeerd, maar wanneer ik het projectje run en ik probeer dit uit, dan loopt mijn hele programma vast in een loopje waarin elke keer het beginmenu opnieuw wordt weergegeven.

Weet iemand hier iets op?
 
Zeker niet de beste manier ter wereld, maar sluit het dichtste aan tegen je huidige code denk ik:[CPP]float basis = 0, hoogte = 0;
int foutmelding = SUCCES;
if (cin >> basis)
{
cout << "en dan nu de hoogte: ";
if (cin >> hoogte)
{
[...]
}
else
{
foutMelding = OPPVIERKANTERROR;
}
}
else
{
foutMelding = OPPVIERKANTERROR;
}[/CPP]

Zoek ook even op cin.bad(), cin.fail(), cin.flush() en cin.clear() voor meer info en verdere afhandeling.
 
Laatst bewerkt:
Zou het ook een mogelijkheid zijn om de waardes eerst in te lezen in een string,
die te controleren op numerieke waardes, en dan via (float) atoi( string ) om te zetten naar een float?
Of is dit nog omslachtiger?
 
Dat is inderdaad ook mogelijk, alleen heb ik me ooit laten wijsmaken dat de implementatie van atoi/atof niet volledig zuiver op de graat is mbt cross-platform coderen; of er wat van aan is, weet ik nog steeds niet (leve onderzoeken :rolleyes:).

Een andere variant van die techniek zou zijn om een stringstream te gebruiken. Je leest dan ook een string in, plaatst deze in de stringstream en probeert vervolgens om een int/float/whatever uit die stringstream te lezen.
Een stringstream werkt een beetje als cin en cout, en is onderdeel van de C++ STL.

Ik heb nu niet direct een voorbeeld daarvan bij de hand, even zoekmachienen levert vast wel enkele voorbeelden op, met vragen kan je dan uiteraard nog steeds hier terecht.
 
Ik ben het met Johantrax eens. Wanneer je in C++ types wil converteren, gebruik dan een stringstream ipv de C-functie atoi()

bijv:
[cpp]
#include <sstream>
#include <string>

using std::string;
using std::stringstream;

[......]

string in = "123";
stringstream sstr(in);
int uit = 0;
sstr >> uit;
[/cpp]
 
Zou iemand mij wat meer kunnen uitleggen over stringstreams?
Ik ben wel al bekend met de basis van streams, ik heb hiermee ook moeten werken voor school. Maar stringstreams werden bij mij niet behandeld.
Ik zal zelf ook nog wel even zoeken naar informatie daarover, maar als iemand een duidelijk voorbeeld zou hebben zou dit wel handig zijn.
 
Ik heb inmiddels een nieuwe, gereviseerde versie van mijn doeActie() methode:

Code:
int doeActie( int keuze )
{
	int foutMelding = SUCCES;
	string invoer;
	stringstream sStream1,
			     sStream2;
	float basis = 0,
		hoogte = 0,
		oppervlakte = 0;
	
	switch( keuze )
	{
		case 1: cout << "Lengte vierkant (cm): ";
				cin >> invoer;
				sStream1 << invoer;
				if( !sStream1.fail() ){
					sStream1 >> basis;
				}
				else{
					foutMelding = OPPVIERKANTERROR;
				}
				
				cout << "Hoogte vierkant (cm): ";
				cin >> invoer;
				sStream2 << invoer;
				sStream2 >> hoogte;
				
				oppervlakte = basis * hoogte;
				cout << "Oppervlakte vierkant: " << oppervlakte << endl;
				
				break;
	}

	if( foutMelding != SUCCES )
	{
		cout << "Foutmelding: " << foutMelding;
	}

	return foutMelding;
}

Deze manier met de stringstreams werkt wel, maar ik weet nog steeds niet hoe ik hiermee kan uitzoeken of er wel een nummerieke waarde is ingevoerd.
Ik heb het nu geprobeerd met !sStream.fail(), maar deze zal nooit geactiveerd worden aangezien elke string die in de stream wordt gestopt automatisch is goedgekeurd.

Mijn vraag is nu, hoe kan ik zeker weten of de waarde die in de stream staat, ook echt nummeriek is?
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan