C++ cout van string lukt niet.

Status
Niet open voor verdere reacties.

Shorkan

Gebruiker
Lid geworden
28 okt 2009
Berichten
6
Ik heb een probleem in het volgende stuk code:
[cpp]
#include <iostream>
#include <string>
using namespace std;

const int zinlengte=30;
const string alfabet = " abcdefghijklmnopqrstuvwxyz";

int random_range(int lowest_number, int highest_number)
{
if(lowest_number > highest_number){
swap(lowest_number, highest_number);
}

int range = highest_number - lowest_number + 1;
return lowest_number + int(range * rand()/(RAND_MAX + 1.0));
}


string maak_random_beginzin()
{
string beginzin;
for(int i=0; i<zinlengte; i++)
{
beginzin = alfabet[random_range(0, 26)];
}
cout << beginzin;
return beginzin;
}



int main()
{
maak_random_beginzin();
return 0;
}
[/cpp]
De cout van de string beginzin in de funcite maak_random_beginzin werkt niet. Hij geeft geen foutmelding, maar er wordt niets ge cout. Als ik hem een bepaalde letter laat couten doet hij het wel, bijvoorbeeld cout << beginzin[5];
Het lijkt er dus op dat het opvullen van de string wel gelukt is. Maar als ik beginzin op een andere manier een waarde geef, bijvoorbeeld beginzin = "aap"; cout << beginzin; doet hij het ook. Het couten is dus ook het probleem niet. Ik heb echt geen idee wat het verder nog zou kunnen zijn. Hulp zou erg gewaardeerd worden.
 
Laatst bewerkt door een moderator:
Als ik hem een bepaalde letter laat couten doet hij het wel, bijvoorbeeld cout << beginzin[5];

Zeker weten? Ik heb het hier eens geprobeerd met deze lus [cpp]for (int i=0;i<zinlengte;i++)
{
cout << i << ": " << beginzin << endl;
}[/cpp] in maak_random_beginzin() en daaruit blijkt dat elke letter leeg is.

Ik heb ook "random_range(0,26);" laten cout'en en daaruit blijkt dat dit steeds 0 oplevert. alfabet[0] is de spatie, kortom de zin bestaat volledig uit spaties.

Verder snap ik je berekening in random_range niet helemaal, dit lijkt me makkelijker:
[cpp]return (rand()%(highest_number+1-lowest_number))+lowest_number;[/cpp] (eventueel wat verder uitgeschreven zodat het er netter uitziet).
 
Je bent een stukje vergeten in je for-loop, namelijk
beginzin = alfabet[random_range(0, 26)];
Als je dat er wel bij zet krijg je met jouw output command deze code:

[cpp]
string beginzin;
for(int i=0; i<zinlengte; i++)
{
beginzin = alfabet[random_range(0, 26)];
cout << i << ": " << beginzin << endl;
}
[/cpp]
En klopt de output, namelijk een kolom cijfers met letters en spaties er achter. Dat de cout van random_range steeds 0 is klopt bij mij echter wel, wat weer niet lijkt te kloppen met de output die ik krijg bij de cout van beginzin in de for-loop, ik krijg niet alleen maar spaties.
 
Laatst bewerkt door een moderator:
Ik had mijn for lus onder de al bestaande for lus [cpp]for(int i=0; i<zinlengte; i++)
{
beginzin = alfabet[random_range(0, 26)];
}[/cpp] gezet. Het effect is hetzelfde als [cpp]for(int i=0; i<zinlengte; i++)
{
beginzin = alfabet[random_range(0, 26)];
cout << i << ": " << beginzin << endl;
}[/cpp]

Beide lussen leveren bij mij het volgende op:
0:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:

[edit]Ik heb net in de "random_range" functie de regel [cpp]return lowest_number + int(range * rand()/(RAND_MAX + 1.0));[/cpp] vervangen door [cpp]return lowest_number + int(rand()%range);[/cpp]
Hierna krijg ik wel een kolom cijfers met letters en spaties erachter, met hetzelfde probleem als jij beschrijft: "cout << beginzin" levert niks op. Ik heb dat kunnen oplossen door de regel [cpp]beginzin = alfabet[random_range(0, 26)];[/cpp] te vervangen door [cpp]beginzin += alfabet[random_range(0, 26)];[/cpp][/edit]
 
Laatst bewerkt:
Hm, vreemd, bij mij geeft hij wel tekens na de getallen als ik dat doe.
 
Dat is inderdaad vreemd. Overigens zou mijn edit je probleem moeten oplossen (het lijkt er op dat je die gemist hebt omdat ik er nog mee bezig was toen je reageerde).
 
[cpp]
string maak_random_beginzin()
{
string beginzin;
for(int i=0; i<zinlengte; i++)
{
beginzin = alfabet[random_range(0, 26)];
}
cout << beginzin;
return beginzin;
}
[/cpp]

Bij een lege string zal beginzin[index] uiteraard niet bestaan, en daardoor kan hij ook niks wegschrijven. Als je een andere constructor gebruikt dan werkt je functie wel:

[cpp]
string maak_random_beginzin()
{
string beginzin(zinlengte, '?'); // beginzin(5, '?') = "?????"
[/cpp]

Of je kunt de oplossing van Supersnail gebruiken. En in de main-functie zou je beter eerst de functie std::srand() kunnen aanroepen, anders is je random_beginzin niet meer zo random. Als je onder Windows werkt zou je het kunnen combineren met GetTickCount:

[cpp]
std::srand(GetTickCount());
// roep maak_random_beginzin() aan
[/cpp]
 
Zeer bedankt voor de hulp, hij werkt nu idd :). Ik snap echter nog steeds niet hoe het kan dat, als het probleem was dat de string leeg is en beginzin[index] niet bestaat, dit stukje het wel doet:

for(int i=0; i<zinlengte; i++)
{
beginzin = alfabet[random_range(0, 26)];
cout << i << ": " << beginzin << endl;
}
 
Zeer bedankt voor de hulp, hij werkt nu idd :). Ik snap echter nog steeds niet hoe het kan dat, als het probleem was dat de string leeg is en beginzin[index] niet bestaat, dit stukje het wel doet:

for(int i=0; i<zinlengte; i++)
{
beginzin = alfabet[random_range(0, 26)];
cout << i << ": " << beginzin << endl;
}


const char& operator[] ( size_t pos ) const;
char& operator[] ( size_t pos );

Get character in string
Returns a reference the character at position pos in the string.

Als de string leeg is bevat het dus ook geen characters.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan