Verdwijnende letters

Status
Niet open voor verdere reacties.

NielsDesmet

Gebruiker
Lid geworden
19 mei 2008
Berichten
301
We zijn voor de school bezig met een spelletje Lingo te implementeren.
We hebben echter een rare fout met een char-array die blijkbaar na een cin de eerste 3 letters gewoon doet verdwijnen! Ik zal hier eens de volledige code posten, maar de betreffende functies zijn eigenlijk enkel "vraagwoord" en "zoeklengte". In die functies heb ik ook een paar commando's gestoken die ons in de gaten laat houden wat er precies allemaal aan het gebeuren is.
Code:
#include <iostream.h>
#include <stdlib.h>
#include <time.h>

typedef char Woord10[10];
typedef bool Ger10[10];

void WisScherm()
{
system("cls");
}

void titel()
{
cout<<"  Team Superior Presents:\n";
cout<<"    #   # #  #  ##   ##\n";
cout<<"    #   # ## # #    #  #\n";
cout<<"    #   # # ## #  # #  #\n";
cout<<"    ### # #  #  ##   ##\n";
cout<<"Druk op ENTER om te starten!\n";

cin.get();
WisScherm();
}

void zoeklengte(Woord10 woord, int &lengtewoord)
{
 	cout<<"Zoeklengte is juist gecalled; Woord is: "<<woord<<" , lengtewoord is: "<<lengtewoord<<" .\n";
	cin.get();
 	lengtewoord = 0;
	cout<<"Lengtewoord zou nu nul moeten zijn en de lus zal subiet gestart worden; Woord is: "<<woord<<" , lengtewoord is: "<<lengtewoord<<" .\n";
	cin.get();
	while(woord[lengtewoord] != '*')
	{
	 	cout<<"woord["<<lengtewoord<<"] is "<<woord[lengtewoord]<<"; Woord is: "<<woord<<" , lengtewoord is: "<<lengtewoord<<" .\n";
		cin.get();
	 	lengtewoord++;
		cout<<"Lengtewoord is eentje bijgeteld; Woord is: "<<woord<<" , lengtewoord is: "<<lengtewoord<<" .\n";
		cin.get();
	}
}

void vraagwoord(Woord10 &woord, int &lengtewoord)
{
 	cout<<"Vraagwoord is juist gecalled; Woord is: "<<woord<<" , lengtewoord is: "<<lengtewoord<<" .\n";
	cin.get();
	for(int i = 0; i < 10; i++)
	{
		woord[i] = '*';
	}
	cout<<"De sterrekeslus is compleet; Woord is: "<<woord<<" , lengtewoord is: "<<lengtewoord<<" .\n";
	cin.get();
	do{
	cout<<"Do...While is gestart; Woord is: "<<woord<<" , lengtewoord is: "<<lengtewoord<<" .\n";
	cin.get();
	cout<<"Geef het woord in:\n";
	cin>>woord;
	cout<<"Ge hebt het woord ingegeven; Woord is: "<<woord<<" , lengtewoord is: "<<lengtewoord<<" .\n";
	cin.get();
	zoeklengte(woord, lengtewoord);
	cout<<"Zoeklengte is voltooid; Woord is: "<<woord<<" , lengtewoord is: "<<lengtewoord<<" .\n";
	cin.get();
	}while(lengtewoord <2 && lengtewoord > 10);
	WisScherm();
}

void bepalenincompleetwoord(int lengtewoord, Woord10 &woordincompleet, Ger10 geraden, Woord10 woord)
{
	int i;

	for(i=0;i<=lengtewoord - 1; i++)
	{
		if(geraden[i])
		{
		woordincompleet[i] = woord[i];
		}
		else
		{
		woordincompleet[i] = '*';
		}
	}
}

void voorbereiden(int &beurten, int Startbeurten, int &lengtewoord, Ger10 &geraden)
{
	int i;

	beurten = Startbeurten;
	geraden[0] = true;

	for(i = 1; i<=lengtewoord; i++)
	{
	geraden[i] = false;
	}
}

void schrijfletters(Woord10 woord, Ger10 geraden, int lengtewoord)
{
	Woord10 woordincompleet;
	int i;
	int j;

	bepalenincompleetwoord(lengtewoord, woordincompleet, geraden, woord);
	cout<<"/-";
	for(i=1; i<= lengtewoord; i++)
	{
	cout<<"-";
	}
	cout<<"-\\"<<endl;
	cout<<"|"<<woordincompleet<<"|"<<endl;
	cout<<"\\-";
	for(j=1; j<= lengtewoord; j++)
	{
	cout<<"-";
	}
	cout<<"-/"<<endl;;
}

void schrijfbeurtenover(int beurten)
{
	cout<<"Je hebt "<<beurten<<" beurten over\n";
}

void zoeklengteletters(int &LengteLetters, Woord10 letters, int tellerke)
{
	do{
		LengteLetters++;
	}while(letters[tellerke] != ' ');
}

void vraagletters(int LengteLetters, Woord10 &letters, int lengtewoord)
{
	int tellerke=0;

	do{
	cout<<"Geef in welk woord dat je denkt dat juist is\n";
	cin>>letters;
	zoeklengteletters(LengteLetters, letters, tellerke);
	tellerke++;
	}while(LengteLetters != lengtewoord);
}

void checkwoord(int lengtewoord, Woord10 letters, Woord10 woord, Ger10 &geraden, bool &WoordGeraden)
{
	int i;
	
	for(i=0; i<lengtewoord; i++)
	{
		if(letters[i] == woord[i])
		{
			geraden[i] = true;
		}
	}
	
	WoordGeraden = true;
	
	for(i=0; i<lengtewoord; i++)
	{
		if(geraden[i] == false)
		{
			WoordGeraden = false;
		}
	}
}

void winnen(char Nogeens)
{
	cout<<"goed zo! Je hebt het woord geraden!\n";
	cout<<"Wil je nog een keer?(J/N)/n";
	cin>>Nogeens;
	WisScherm();
}

void verliezen(char Nogeens)
{
	cout<<"Jammer, je hebt verloren...\n";
	cout<<"Wil je nog een keer?(J/N)/n";
	cin>>Nogeens;
	WisScherm();
}

void main()
{
	Woord10 woord;
	Ger10 geraden;
	int lengtewoord;
	char Nogeens = 'j';
	int const Startbeurten = 5;
	int beurten;
	Woord10 letters;
	bool WoordGeraden;
	int LengteLetters = 0;
	
	titel();
	do{
	
		vraagwoord(woord, lengtewoord);
		voorbereiden(beurten, Startbeurten, lengtewoord, geraden);
			while(WoordGeraden = false && beurten < 0)
			{
				schrijfletters(woord, geraden, lengtewoord);
				schrijfbeurtenover(beurten);
				vraagletters(LengteLetters, letters, lengtewoord);
				checkwoord(lengtewoord, letters, woord, geraden, WoordGeraden);
			}
	}while(Nogeens == 'j' || Nogeens == 'J');
	if(WoordGeraden = true)
	{
		winnen(Nogeens);
	}
	else
	{
		verliezen(Nogeens);
	}
}

Het resultaat is als volgt:
Code:
Vraagwoord is juist gecalled; Woord is: ╠╠╠╠╠╠╠╠╠╠╠╠└*↕ , lengtewoord is: -85899
3460 .
appelflap*
De sterrekeslus is compleet; Woord is: **********╠╠└*↕ , lengtewoord is: -858993
460 .
Do...While is gestart; Woord is: **********╠╠└*↕ , lengtewoord is: -858993460 .
Geef het woord in:
Ge hebt het woord ingegeven; Woord is: elflap* , lengtewoord is: -858993460 .
Zoeklengte is juist gecalled; Woord is: elflap* , lengtewoord is: -858993460 .

Lengtewoord zou nu nul moeten zijn en de lus zal subiet gestart worden; Woord is
: epke , lengtewoord is: 0 .

woord[0] is e; Woord is: epke , lengtewoord is: 0 .

Lengtewoord is eentje bijgeteld; Woord is: epke , lengtewoord is: 1 .

woord[1] is p; Woord is: epke , lengtewoord is: 1 .

Lengtewoord is eentje bijgeteld; Woord is: epke , lengtewoord is: 2 .

woord[2] is k; Woord is: epke , lengtewoord is: 2 .

Lengtewoord is eentje bijgeteld; Woord is: epke , lengtewoord is: 3 .

woord[3] is e; Woord is: epke , lengtewoord is: 3 .

Lengtewoord is eentje bijgeteld; Woord is: epke , lengtewoord is: 4 .

woord[4] is  ; Woord is: epke , lengtewoord is: 4 .

Lengtewoord is eentje bijgeteld; Woord is: epke , lengtewoord is: 5 .

Zoeklengte is voltooid; Woord is: epke , lengtewoord is: 5 .

Vraagwoord is juist gecalled; Woord is: epke , lengtewoord is: 5 .

De sterrekeslus is compleet; Woord is: **********╠╠└*↕ , lengtewoord is: 5 .

Do...While is gestart; Woord is: **********╠╠└*↕ , lengtewoord is: 5 .

Geef het woord in:

Merk op dat hij om een of andere reden van "appelflap" "elflap " maakt en van "snoepke" maakt hij "epke", hij vergeet dus gewoon de eerste 3 letters en zet er een spatie achter.

Wat is er fout?
 

Woord is een C-string (array), dus dit kan sowieso niet. Hiervoor kan je de functie getline gebruiken. Zie ook dit topic op helpmij over ditzelfde probleem.

[edit]Ik zie overigens net dat het wel kan, al zou ik toch proberen om het te vervangen. Deze manier heeft namelijk problemen bij spaties, enters, tabs etc.[/edit]

[edit2]Ik heb net jullie programma gecompileerd en hij werkt wel. Je geeft het woord op de verkeerde plek in (namelijk bij een cin.get()). Als je het woord op de juiste plek ingeeft werkt het wel:
frank@darkstar:~$ ./lingo
Team Superior Presents:
# # # # ## ##
# # ## # # # #
# # # ## # # # #
### # # # ## ##
Druk op ENTER om te starten!

Vraagwoord is juist gecalled; Woord is: ϱÀ , lengtewoord is: -1209517936 .

De sterrekeslus is compleet; Woord is: **********j , lengtewoord is: -1209517936 .

Do...While is gestart; Woord is: **********j , lengtewoord is: -1209517936 .

Geef het woord in:
appelflap
Ge hebt het woord ingegeven; Woord is: appelflap , lengtewoord is: -1209517936 .
Zoeklengte is juist gecalled; Woord is: appelflap , lengtewoord is: -1209517936 .
Desalniettemin is getline toch aan te raden. Daarmee kan je namelijk opgeven hoeveel tekens er ingelezen moeten worden. Omdat de array maar 10 (eigenlijk 9 omdat er ook een \0 aan het eind moet staan) tekens kan bevatten is dat veiliger.[/edit2]
 
Laatst bewerkt:
En als je dan toch dingen aan het veranderen bent: gebruik dan direct std::string ipv char-arrays.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan