bruger input i variabler

Tags:    c++

<< < 12 > >>
overskriften er ikke lige verdens bedste, men kunne ikke finde på noget bedre. Mine spørgsmål er:

Hvordan sikre man at brugere ikke skriver fks. en char, i en int variable?

Vis man foreksempel indtaster: hej. Og det bliver lagt ind i en char variabel, er det jo kun h der kommer med, er der nogen måde man kan give brugeren en advarsel om det?



16 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 1 karma
Sorter efter stemmer Sorter efter dato
Når du laver dit vindue skal du bare bruge attributten ES_NUMBER i style...:)



er ikke nået til at bruge windows API endu...



Den mest konsekvente løsning er at montere en robotarm der banker brugeren over fingrene når han forsøger at trykke på en forkert tast...

I praksis vil man ofte kunne nøjes med lidt kode. Grundprincippet er at man altid læser en hel streng (som man ikke kan putte noget forkert i) og derpå konverterer strengen til det ønskede. Dermed kan man checke om brugeren har tastet forkert og reagere fornuftigt hvis han har.
Jeg har skrevet lidt om det her: http://damb.dk/keyread.php



tak for svaret :D har ikke tid til at læse det nu, men læser det nok imorgen.



hmmm... forstår ikk helt det her:

Fold kodeboks ind/udKode 


først laver man en template function der bliver kladt med to parametre, en der heder t&(hvad gør "&"?? det kan jo ikke være en referance når den ikke referare til noget, og der bliver ikke brugt pointere så det er vel heller ikke hukommelses adressen)

den anden parameter forstår jeg intet af, andet end det ligner at den laver en referance med typen istream, men det skal man vel ikke gøre i parametre linien.

det første der sker i funktionen er at der bliver erkleret en string variabel(s)

så laver du en getline(is, s) vis nummer 2 parametre virker som en slags referance betyder det vel i virkeliheden getline(std::cin, s)

så aner jeg ikke hvad det der string stream gør andet end det på en eller anden måde putter s ind i ss.

til sidst retunere den ss, som må være et tal?... det virker bare mærkeligt da det er en bool funktion...

så bruger du det her til at samle bruger indput:
Fold kodeboks ind/udKode 


det forstår jeg nogen lunde.



Lad os tage den én linje af gangen:

template <typename T>
Det følgende er en template "dims" (i dette tilfælde en funktion), template parameteren er T som kan være enhver type.

bool Get(T &t, std::istream &is = std::cin)
Her erklæres funktionen Get, den tager en reference til et objekt af typen T som første parameter og en reference til en inputstream som anden parameter, hvis man ikke angiver anden parameter bruges std::cin, det kunne også være en fil eller ... Funktionen Get returnerer en bool, som fortæller om det gik godt.

std::string s;
std::getline(is, s);
Vi opretter en streng, og henter indholdet fra inputstreamen (default std::cin)

std::stringstream ss(s);
En std::stringstream fungerer lidt på samme måde som std::cin eller en fil, vi kan streame fra den. Vores stringstream gives indholdet fra strengen som var det vi læste fra inputstreamen.

return ss >> t;
Her forsøger vi at hente værdien af t fra vores stringstream, t er af typen T, dvs. template parameteren så det kan være enhver type. I modsætning til hvad man kunne tro er resultatet af (ss >> t) ikke værdien der blev streamet, men en bool der fortæller om operationen gik godt. Hvis vores stringstream indeholdt "peter" fordi brugeren tastede forkert da han blev spurgt om alder, og t er en int vil >> operationen gå galt og vi vil returnere false.




forstår det lidt bedre nu, men har stadiig nogle spørgsmål...

"std::string s;
std::getline(is, s);
Vi opretter en streng, og henter indholdet fra inputstreamen (default std::cin)"


hvordan bliver den første parametre til input streamen.... er den(input streamen) ikke bare tom. Desuden når det er en get line venter den så ikke på man indtaster noget.

"std::stringstream ss(s);
En std::stringstream fungerer lidt på samme måde som std::cin eller en fil, vi kan streame fra den. Vores stringstream gives indholdet fra strengen som var det vi læste fra inputstreamen."


hvorfor skal det laves om til en stream, bliver det ikke til en stream når vi i næste linie prøver at putte den ind i t.

"return ss >> t;
Her forsøger vi at hente værdien af t fra vores stringstream, t er af typen T, dvs. template parameteren så det kan være enhver type. I modsætning til hvad man kunne tro er resultatet af (ss >> t) ikke værdien der blev streamet, men en bool der fortæller om operationen gik godt. Hvis vores stringstream indeholdt "peter" fordi brugeren tastede forkert da han blev spurgt om alder, og t er en int vil >> operationen gå galt og vi vil returnere false."


hvordan kan det være at den ikke prøver at putte ss ind i t, men bare chekker om man kan?? og vis den kun chekker, hvor henter jeg så det input der er blevet skrevet henne?

kan godt være at det er nogle dumme spørgsmål, er ikke sikker på at jeg helt har forstået hvad en stream er endnu.



Indlæg senest redigeret d. 16.05.2008 16:00 af Bruger #13669
hvordan bliver den første parametre til input streamen.... er den(input streamen) ikke bare tom. Desuden når det er en get line venter den så ikke på man indtaster noget.


is er den input stream der blev givet da funktionen blev kaldt, default std::cin. Hvis is er std::cin vil std::getline vente på at brugeren taster noget, hvis is er en fil vil std::getline forsøge at læse en linje fra filen.

hvorfor skal det laves om til en stream, bliver det ikke til en stream når vi i næste linie prøver at putte den ind i t.


Man kan ikke "stream'e" fra en string, kun fra streams. At stream'e betyder her at konvertere "steamen" til et objekt af type T.

hvordan kan det være at den ikke prøver at putte ss ind i t, men bare chekker om man kan?? og vis den kun chekker, hvor henter jeg så det input der er blevet skrevet henne?


Den konverterer også. Dvs. den putter værdien over i t og fortæller om det gik godt.



tror sku' at jeg har fanget den nu, prøver at køre et program der bruger det. Jeg skulle måske have prøvet at lave programmet før, men på den anden side er det jo svært vis man ikke fatter hvordan det virker.

jeg har forstået det sådan har:

når man skriver Get(m); kommer der en linje hvor brugeren kan indtaste noget. m bliver så reultatet, og funktionen retunere om det gik godt.

s >> t; kan kun bruges fordi vi har: std::stringstram s(ss);

prøver at køre programmet lige om lidt.

Tusind tak for hjælpen, vi du vil have points, så bare opret et svar :D



når man skriver Get(m); kommer der en linje hvor brugeren kan indtaste noget. m bliver så reultatet, og funktionen retunere om det gik godt.


Jep.

Jeg samler ikke på point.



<< < 12 > >>
t