oneindige loop

Status
Niet open voor verdere reacties.

skelesp

Nieuwe gebruiker
Lid geworden
21 sep 2006
Berichten
2
Hallo,

Ik ben nieuw hier op helpmij.nl. Ik ben sinds kort begonnen met programmeren in C en C++, maar dat gaat niet altijd even vlot...
Vandaar hieronder een eerste vraagje:

In onderstaande code loopt alles goed totdat ik bij de scanf iets niet numeriek ingeef. Dan komt het programma in een oneindige loop.

Hoe kom ik hier in een oneindige lus en hoe kan ik het vermijden?

(antwoord[] is een integer en dat zou ik ook graag zo houden, want het wordt over het volledige programma nogal veel gebruikt.)

alvast bedankt!



for (i = 1; i <= AANTAL_VRAAG; i++)
{
start:
printf("\nStelling %d: %s\n",i, vraag[i-1]);
printf("-> Uw mening: ");
scanf("%d",&antwoord[i-1]);

if(isdigit(antwoord[i-1]))
{
if (1 > antwoord[i-1] || antwoord[i-1] > 4)
{
printf("\n*** Gelieve enkel getallen tussen 1 en 4 in te vullen***\n");
goto start;
}
}
else
{
printf("\n*** Gelieve enkel getallen tussen 1 en 4 in te vullen***\n");
goto start;
}
printf("\n---------------------------------------------------------------------\n");
}
 
hmm ik ben niet zeker... Het zou kunnen dat je toevallig je geheugenplaats voor antwoord[] overschrijft enzo vreemde dingen begint te doen, maar mss kan je best beginnen om te checken of het gegeven antwoord nu wel degelijk een integer was?
bool rejected = true;
do {
scanf("%d",&antwoord[i-1]);
if(antwoord[i-i] > 0) { rejected = false; }
} while(rejected) ;

?
[edit] laat ook maar ik heb net je script tegoei gelezen:)
Kan je eens de output van die loop geven? (bv ./runprogram >> output.txt)
 
Laatst bewerkt:
Isdigit loopt hier vast wanneer er geen numerieke waarde is opgegeven. Onderstaand voorbeeld geeft ongeveer dezelfde problemen. (ook een oneindige loop)

Code:
int main()
{


	bool bGevonden = false;
	int x;

	while(! bGevonden)
	{
		system("cls");
		cout << "Geef x een waarde: ";
		cin >> x;

		if(x >= 0)
		{
			if(x > 0 && x <= 4)
			{
				cout << "x voldoet aan uw eisen." << endl;
				bGevonden = true;
			}
		}
		else
		{
			cout << "Error!" << endl;
	        	/* break; */
		}
	}
	system("pause");
	return 0;
}


Wanneer er bij bovenstaande code geen numeriek getal wordt opgegeven krijg je een oneindige lus. Voeg je het break toe dan stopt het programma en krijg je geen oneindige lus.

Wel leuk om een e-prog lid op deze site te zien :D
 
scanf is een functie met weinig foutafhandeling. Je kunt er wel een return-waarde uitkrijgen maar deze slaat meestal nergens op.
Scanf zoekt (omdat je %d gebruikt) een numeriek op. Zodra iets niet numeriek is, stop hij geeft een error terug en probeerd het opnieuw. Daar zou je op kunnen controleren, maat beter kun je getch() gebruiken, dit is het *veel* lichtere broertje van scanf
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan