[C++] String naar Int

Pagina: 1
Acties:

  • Gurneyhck
  • Registratie: April 2002
  • Laatst online: 08:48
Ik zit met het volgende probleem. Ik heb een tabel gemaakt waarin namen met bijbehorende leeftijden worden opgeslagen. de tabel is als volgt gedeclareerd:

string a[10][2];

Er kunnen hier dus 10 namen worden opgeslagen, deze komen dan in a[x][0] te staan. De leeftijden komen in a[x][1] te staan. Nu wil ik het gemiddelde berekenen van de leeftijden. Probleem is, het zijn strings dus ik moet ze eerst omzetten naar een int. Ik heb het al op allerlei manieren geprobeerd maar ik kom er echt niet uit. Ik heb o.a. de "atoi" functie al geprobeerd, maar dan zegt borland vrolijk "cannot convert string to int".
En gewoon dit neerzetten werkt ook niet:

c = a[2][1]

Hulp is dus nodig :)

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 11-03 14:33

NMe

Quia Ego Sic Dico.

Borland? De C++ Builder in Windows? Die heeft toch een IntToStr-functie?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • GX
  • Registratie: Augustus 2000
  • Laatst online: 14-05-2025

GX

Nee.

String object?

Ik denk dan direct hieraan:

val = atoi(a[i][1].c_str());

[ Voor 26% gewijzigd door GX op 06-03-2006 13:45 ]


  • Gurneyhck
  • Registratie: April 2002
  • Laatst online: 08:48
Dat zou best kunnen, maar ik wil dus andersom he. Van string naar int.

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 11-03 14:33

NMe

Quia Ego Sic Dico.

Gurneyhck schreef op maandag 06 maart 2006 @ 13:45:
Dat zou best kunnen, maar ik wil dus andersom he. Van string naar int.
Dan heb je StrToInt. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Gurneyhck
  • Registratie: April 2002
  • Laatst online: 08:48
Oké, maar hoe gebruik je die functie dan? Komt waarschijnlijk een beetje noob over B) , maar ik kom er echt niet uit.
Als je even een voorbeeldje kan geven als in:

string functie int
a[2][1] StrToInt c

Zou dat helemaal geweldig zijn!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 11-03 14:33

NMe

Quia Ego Sic Dico.

Tik eens StrToInt in, klik erop en druk dan op F1? :?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • FoOnEeN
  • Registratie: Juli 2003
  • Laatst online: 02-04 19:40
Je krijgt volgens mij dan:

int c = StrToInt(a[2][1]);

  • Gurneyhck
  • Registratie: April 2002
  • Laatst online: 08:48
FoOnEeN schreef op maandag 06 maart 2006 @ 14:07:
Je krijgt volgens mij dan:

int c = StrToInt(a[2][1]);
Als ik dit doe dan geeft hij een error:
[C++ Error] Unit1.cpp(34): E2034 Cannot convert 'string' to 'AnsiString'
[C++ Error] Unit1.cpp(34): E2342 Type mismatch in parameter 'S' (wanted 'const AnsiString', got 'string')

Werkt dus alleen met Ansistring ofzo.

En als ik StrToInt intik en druk op f1 dan krijg ik een voorbeeld te zien waar ik vrij weinig van snap. Maargoed, ik heb het dus ff gekopiërd en nu runt hij wel. Maar wat er nu precies gebeurt is me niet duidelijk, want ik weet dus niet waar die int wordt opgeslagen.
Dit is de zin uit het voorbeeld (ook weer met ansistring erin trouwens). Het enige wat ik heb gedaan is de array locatie toevoegen. Maar waar wordt de int nu opgeslagen, dat is de vraag.
extern PACKAGE int __fastcall StrToInt(const AnsiString a[2][1]);

Ohja nog één dingetje, ik werk wel met borland, maar wel gewoon met de console-omgeving.

  • whoami
  • Registratie: December 2000
  • Laatst online: 07-04 22:26
code:
1
StrToInt (a[2][1].c_str())

https://fgheysels.github.io/


  • edeboeck
  • Registratie: Maart 2005
  • Laatst online: 07-04 17:22

edeboeck

mie noow noooothing ...

Beste TS,
Gurneyhck schreef op maandag 06 maart 2006 @ 14:15:
[knip]
Het enige wat ik heb gedaan is de array locatie toevoegen. Maar waar wordt de int nu opgeslagen, dat is de vraag.
C++:
1
extern PACKAGE int __fastcall StrToInt(const AnsiString a[2][1]);

[knip]
niet slecht bedoeld hoor, maar als ik bovenstaande quote lees, heb ik de indruk dat je wel (heel) nieuw bent in (C++-)programmatie en een aantal basisprincipes helemaal niet door hebt (wat helemaal geen verwijt is, we zijn allemaal ooit ergens moeten beginnen).

Daarom volgende tip: Google eens naar tutorials of nog beter: loop eens langs in de plaatselijke bib en ontleen er een boek waarin de basis wordt uitgelegd.

Als oplossing voor je probleem, probeer eens:
C++:
1
c = StrToInt(a[2][1].c_str())

edit:
weer net te laat ...

[ Voor 3% gewijzigd door edeboeck op 06-03-2006 14:32 ]


  • Gurneyhck
  • Registratie: April 2002
  • Laatst online: 08:48
Oké dat laatste werkt! thx iedereen.
En nog even tegen edeboeck, ben idd. wel een beetje noob zoals ik zelf ook al zei. Maar er zijn ook 80.000 manieren om van string naar int te gaan, als je googled. En die zijn niet allemaal even helder uitgelegd, dus vandaar mijn vraag hier.

  • edeboeck
  • Registratie: Maart 2005
  • Laatst online: 07-04 17:22

edeboeck

mie noow noooothing ...

En nog even tegen edeboeck, ben idd. wel een beetje noob zoals ik zelf ook al zei.
Geen probleem hoor dat noob zijn ... been there, done that B) ... je wilt bijleren en zo kom je er wel.
Maar er zijn ook 80.000 manieren om van string naar int te gaan, als je googled. En die zijn niet allemaal even helder uitgelegd, dus vandaar mijn vraag hier.
Je hebt gelijk ... ik bedoelde het eigenlijk niet specifiek op je vraag hier, maar eerder om je algemene basis bij te schaven. slecht geformuleerd van me 8)7

  • Depress
  • Registratie: Mei 2005
  • Laatst online: 03-04 10:13
Ik lees hier het topic door. Je zet een String om naar een Integer, deze kan dus ook niet numerike waarden hebben. probeer daarom TryStrToInt(VariablenaamMetString, VariableInteger);
Dit is zo in Borland Delphi. Weet niet of het ook in C++ Builder zit.

Je moet in indergeval even kijken of je waarden een Integer is. Anders krijg je een mooie AV!

  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

Waarom zou je een access violation krijgen als je string geen int is? Een access violation krijg je als je geheugen probeert te lezen/schrijven waar je geen toegang toe hebt. Zo'n StringToInt functie zal hoogstens een exception gooien (nee dat is dus geen AV!), of gewoon 0 retourneren.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 27-03 16:52
Ik kan een snelle StrToInt schrijven die een AV geeft op illegale input, wil natuurlijk niet zeggen dat iemand zo dom is. (Lookup table van digit[i]-'0'+digit[i+1], dan heb je twee digits per iteratie. )

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

't kan wel, want als digit[i]==0 dan hoef je de LUT niet meer te gebruiken, dus dan heb je altijd 2 hele digits of 1 digit en \0 ;)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • ATS
  • Registratie: September 2001
  • Laatst online: 12-02 13:46

ATS

Mag ik een domme vraag stellen? Waarom stop je überhaupt de leeftijd in een string in die array? Waarom maak je geen 1 dimentionele array van structs?

code:
1
2
3
4
5
6
struct Persoon {
  string naam;
  int leeftijd;
};

Persoon personen[10];

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 07-04 14:35

Robtimus

me Robtimus no like you

ATS schreef op maandag 06 maart 2006 @ 23:13:
Mag ik een domme vraag stellen? Waarom stop je überhaupt de leeftijd in een string in die array? Waarom maak je geen 1 dimentionele array van structs?

code:
1
2
3
4
5
6
struct Persoon {
  string naam;
  int leeftijd;
};

Persoon personen[10];
Of beter nog, een class genaamd Persoon.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
IceManX schreef op dinsdag 07 maart 2006 @ 11:53:
[...]
Of beter nog, een class genaamd Persoon.
Hoezo zou een class beter zijn? Als je het alleen voor zulke simpele data wilt gebruiken en voor de rest nergens voor dan voldoet een struct perfect.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

C++:
1
2
3
4
5
6
7
#include <sstream>
#include <string>

std::string str("25");
std::istringstream iss(str, std::istringstream::in);
int age;
iss >> age;

  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

IceManX, rwb: Itt C# is er in C++ geen verschil tussen een class en een struct; enkel de default access modifiers zijn anders (members van een struct zijn default public, die van een class private). Dus anders dan puur persoonlijke stijl (zoals struct gebruiken voor PODs, class voor echte klassen) is er niet echt een reden om voor class ipv struct te kiezen.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
.oisyn schreef op dinsdag 07 maart 2006 @ 12:36:
IceManX, rwb: Itt C# is er in C++ geen verschil tussen een class en een struct; enkel de default access modifiers zijn anders (members van een struct zijn default public, die van een class private). Dus anders dan puur persoonlijke stijl (zoals struct gebruiken voor PODs, class voor echte klassen) is er niet echt een reden om voor class ipv struct te kiezen.
dat is idd waar ik op doelde ;)

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 27-03 16:52
.oisyn schreef op maandag 06 maart 2006 @ 22:49:
't kan wel, want als digit[i]==0 dan hoef je de LUT niet meer te gebruiken, dus dan heb je altijd 2 hele digits of 1 digit en \0 ;)
Dat werkt wel als er alleen '0'-'9' en \0 in zit, maar als je "AA" hebt dan zit je achter de LUT.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • Paul
  • Registratie: September 2000
  • Laatst online: 00:05
Je bent al tegen de eerste irritaties die ik met C(++) heb opgelopen: het ontbreken van _1_ string-type dat meteen _overal_ mee werkt. Zodra het gore lef hebt in C(++) met strings te willen werken mag je je hele code volplempen met .c_str()'s, casts naar char*, verdwalen in pointers, eeuwen zoeken naar die ene functie die dan toch AnsiString pikt, vloeken omdat string en String incompatible zijn met elkaar, op Internet 3 miljard code snippets vinden die ieder weer anders met strings omgaan etc etc etc... Die functie wil char*'s, die functie wil AnsiStrings, weer een andere functie is geschreven voor strings en die functie met String is eigenlijk toch ook wel makkelijk...

Leuk taaltje, maar o wee als je iets met strings wilt doen, want als je bij 1 type wilt blijven mag je constand het wiel opnieuw uitvinden.

Disclaimer: misschien heb ik de heilige graal mbt C-strings nog niet gevonden, maar tussen toen we 4 jaar terug op school met char*'s moesten werken in C++ en nu heb ik niet heel veel (maar zeker ook niet niets) met C gedaan, met name omdat ik nog steeds nachtmerries heb van die string :P Op mijn werk (Delphi) is iedere 2e variabele een string zeg maar, en hoewel ik daar af en toe best zou willen dat Delphi net als Java impliciet cast tussen strings en ints etc hoef je je in ieder geval niet druk te maken over de vercshillen tussen AnsiStrings, WideStrings en ShortStrings, het werkt toch wel :)

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

Sorry hoor Paul, maar je relaas geeft meer je eigen onervarenheid mbt C++ weer. C-strings heten niet voor niets zo en kun je dus beter mijden in C++. Soms heb je ze toch nodig omdat een API ze verwacht, maar dan is het aanroepen van c_str() zo gebeurd. En gebruik gewoon std::string, de strings die Borland introduceert (AnsiString e.d.) zijn niet eens standaard C++ dus zijn ook niet van toepassing in je verhaal :).

En als je types makkelijk wilt converteren naar strings:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <string>
#include <sstream>

template<class T> std::string toString(const T & t)
{
    std::ostringstream out;
    out << t;
    return out.str();
}

int main()
{
    std::string i = toString(34);
}

[ Voor 28% gewijzigd door .oisyn op 07-03-2006 14:48 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Paul
  • Registratie: September 2000
  • Laatst online: 00:05
Vandaar mijn disclaimer :P Schijnbaar bestaat er zelfs inderdaad zoiets als C-strings, want ik gebruikte die benaming meer als verzamelnaam voor het fenomeen string in de programeertaal-familie C :P

Maar ook std::string is schijnbaar niet heilig, want bij zo ongeveer de meest gebruikte bewerking erop (omzetten naar een integer, volgens mij wordt alleen concateneren vaker gebruikt) staat hier in het topic al overal c_str() bij...

Edit: het is maar wat je simpel noemt :P Ik zie een beginner nog geen templates of streams gebruiken (behalve dan cout en cin, en vaak zelfs dat met moeite :P ) -> de zoveelste copy/paste van code vanaf internet om iets simpels te doen ;)

[ Voor 22% gewijzigd door Paul op 07-03-2006 14:51 ]

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

Gebruik dan de portable boost::lexical_cast. En niemand beweert natuurlijk dat C++ een lage drempel heeft ;)
(en een beginner zou weldegelijk streams moeten gebruiken, hoe moet ie anders z'n eerste hello world in C++ schrijven? Printf & co is natuurlijk iets waar een beginner in C++ helemaal vanaf moet blijven)

[ Voor 38% gewijzigd door .oisyn op 07-03-2006 14:54 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • schoene
  • Registratie: Maart 2003
  • Laatst online: 07:43
Kijk dan eens naar Zoijar zijn methode. Zie je daar een c_str () staan?

Edit: reactie op Paul

[ Voor 22% gewijzigd door schoene op 07-03-2006 14:53 ]


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Ik heb een gruwelijke hekel aan oude C code die geen const char* maar een char* vraagt... ugh. Vaak doe ik maar het evil:

C++:
1
legacy_call(const_cast<char*>(str.c_str()));

Je weet alleen nooit of dit legal is... Maar om eerst een copy te gaan draaien van die string gaat me echt te ver... Anyway, zonder legacy code werkt std::string heerlijk hoor. Compatible met de meest exotische streams... en in welke taal kan je met een functie van 3 regels elk data type naar string converteren (zie oisyn's code) en andersom? Ideaal toch.

  • Paul
  • Registratie: September 2000
  • Laatst online: 00:05
.oisyn schreef op dinsdag 07 maart 2006 @ 14:52:
Gebruik dan de portable boost::lexical_cast. En niemand beweert natuurlijk dat C++ een lage drempel heeft ;)
(en een beginner zou weldegelijk streams moeten gebruiken, hoe moet ie anders z'n eerste hello world in C++ schrijven? Printf & co is natuurlijk iets waar een beginner in C++ helemaal vanaf moet blijven)
Hmm, ik wil een string naar integer converteren -> str to int -> StrToInt -> boost::lexical_cast.. Hoge drempel okee, maar dat durf ik toch wel een beetje belachelijk te noemen :+
Juist vanwege "Hello World" naar std-out noem ik cin en cout, en aangezien je daar (ook) integers aan kunt voeren is de conclusie dat een stream misschien wel een operator<<(const int) (ofzo) heeft niet heel ver weg, maar (en dat kan goed komen omdat ik vooral Delphi en een beetje Java, waar het dan weer wel wat vaker voorkomt) om voor een StrToInt een stream te instantieren?
Goed, het gaat om voorbeeldjes waar de c_str() wordt vermeden, maar _ik_ vind het een omweg :)
schoene schreef op dinsdag 07 maart 2006 @ 14:53:
Kijk dan eens naar Zoijar zijn methode. Zie je daar een c_str () staan?
Nope, daar heb ik overheen gelezen :) Maar ook daar weer de omweg via een stream.
Zoijar schreef op dinsdag 07 maart 2006 @ 15:29:
Anyway, zonder legacy code werkt std::string heerlijk hoor. Compatible met de meest exotische streams... en in welke taal kan je met een functie van 3 regels elk data type naar string converteren (zie oisyn's code) en andersom? Ideaal toch.
En weer streams :P Schijnbaar hangt C++ van de streams aan elkaar :) Ik zal er aan denken als ik weer eens ergens tegenaan loop :)

Wat betreft je vraag: euhm, de eerste paar die bij me opkomen: Delphi (1 regel, StrToInt, DateTimeToStr, FloatToStr, FormatFloat, etc), Java (0 regels, impliciet), VB (1 regel, CInt), PHP (1 regel, intval)... Of bedoel je _1_ functie die _alle_ types kan converteren? Dat wordt lastig, voornamelijk omdat lang niet iedere taal operator-overloading ondersteund waardoor je voor ieder typen een ToString moet implementeren (net zoals je me voor C++ dus voor ieder ding een std::string operator<<(const MyType& x) (oid) lijkt te moeten defineren wil het iets zinnigs opleveren)

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

Paul Nieuwkamp schreef op dinsdag 07 maart 2006 @ 16:44:
Hmm, ik wil een string naar integer converteren -> str to int -> StrToInt -> boost::lexical_cast.. Hoge drempel okee, maar dat durf ik toch wel een beetje belachelijk te noemen
Tja, maar boost zou iedere zichzelf respecterende C++'er al geïnstalleerd moeten hebben. Veel van de functies en classes in die library komen ook gewoon in de volgende C++ standaard terecht, dus wat dat betreft doe je er ook goed aan daar nu al bekend mee te geraken :)
In principe doe je een cast, en de cast is lexicaal. Een functie die StrToInt heet kan alleen strings naar ints converteren. Een lexical_cast kan van string naar alles en weer terug :).

En ook stringstreams zouden gemeengoed moeten zijn onder de beginners, het is ideaal om verschillende typen naar een string te formatteren of ze daar juist uit te halen.
(net zoals je me voor C++ dus voor ieder ding een std::string operator<<(const MyType& x) (oid) lijkt te moeten defineren wil het iets zinnigs opleveren)
Die je typisch implementeert voor alle typen die je van/naar leesbare tekst wilt converteren :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Paul
  • Registratie: September 2000
  • Laatst online: 00:05
.oisyn schreef op dinsdag 07 maart 2006 @ 16:55:
...dus wat dat betreft doe je er ook goed aan daar nu al bekend mee te geraken :)
Bij deze :) Tis de eerste keer dat ik er van hoor :P
En ook stringstreams zouden gemeengoed moeten zijn onder de beginners, het is ideaal om verschillende typen naar een string te formatteren of ze daar juist uit te halen.
Vertel dat op alle scholen en zo :P (Of iig Avans in 's Hertogenbosch, HBO software engineering) Die leren je voor het vak C++ vrolijk aan om in C++builder4 char*'s te gebruiken... const? Wat is dat? Oh ja, die heb je bij sommige dingen die je in je eigen klasse ook defineert (zoals copy ctor) ook nodig anders gaat de compiler zeuren...

Maar goed, dat dat geen geweldige leraar was wisten alle leerlingen toch al :P Hopelijk is dat op andere scholen beter...

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


  • TheNameless
  • Registratie: September 2001
  • Laatst online: 07-02-2025

TheNameless

Jazzballet is vet!

Eigenlijk zou iedereen imo de C++ FAQ: http://www.parashift.com/c++-faq-lite/ moeten doornemen alvorens uberhaupt iets te doen met code.

Dingen als const-correctness zijn mijn inziens essentieel bij C++

On-topic: ik doe het ook met de boost::lexical cast, makkelijker is er bijna niet.

[ Voor 17% gewijzigd door TheNameless op 07-03-2006 19:41 ]

Ducati: making mechanics out of riders since 1946


  • ATS
  • Registratie: September 2001
  • Laatst online: 12-02 13:46

ATS

Ik hou het op QString, en ik heb eigenlijk nooit de neiging om iets anders te gaan gebruiken. Then again, ik ben een beetje een Qt fanboy :)

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant


Verwijderd

ATS schreef op woensdag 08 maart 2006 @ 14:04:
Ik hou het op QString, en ik heb eigenlijk nooit de neiging om iets anders te gaan gebruiken. Then again, ik ben een beetje een Qt fanboy :)
Helaas betaal je voor een commerciële versie van Qt minimaal 1420 euro (Qt Console, zonder GUI module). Beetje overkill misschien als je alleen geïnteresseerd bent in een handige string class...

[ Voor 4% gewijzigd door Verwijderd op 08-03-2006 14:19 ]


  • ATS
  • Registratie: September 2001
  • Laatst online: 12-02 13:46

ATS

Tsja... misschien tijd om GPL software te gaan schrijven dan? ;)

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 27-03 16:52
Qt is een koopje. Als je het als hobby doet is het gratis (zie GPL) en als je het commercieel gebruikt is het meestal tijds- en dus geldbesparend (meestal als in 'je moet er geen OS kernel in schrijven' ;) )

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1