Gå til innhold

Program klikker helt av input


Anbefalte innlegg

Skrevet

int option;
cin >> option;

if ( option == 1 )
{
// kode
}
else
{
 // kode
}

 

Funker fint når man skriver 1 eller 2 osv osv.

Men hvis man skriver noe annet enn et nr klikker det helt. Alt begynner å loope flere ganger osv. Hva kan jeg gjøre for å ungå dette?

Videoannonse
Annonse
Skrevet (endret)

ta en titt på cin.ignore()

 

bokstaven (eller det som ikke var et tall) ligger fortsatt i stdin-bufferen .. derfor looper programmet hver gang du venter på ny input (cin >> something) .. da det ellerede ligger data i bufferen .. men denne er feil .. og feiler igjen .. og igjen

 

skrevet fryktelig fort dette ... les noe om io-bibliotekene

 

 

edit:

 

ooh ... btw ..

cin returnerer false om noe feiler ..

if(!(cin >> option)) {

cin.igonre(); // noe silkt .. blabla

 

} else if(option == 1) {

doStuff();

}else if(option == 2) {

doSomeOtherStuff();

} ...etc.

Endret av søppel
Skrevet (endret)

	template<typename T>
void readStdin(T& t, std::string msg, std::string on_wrong_input)
{	
 std::cout << msg << std::flush;
 while(!(std::cin >> t)) {
 	std::cout << on_wrong_input;
 	std::cin.clear();
 	std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
 	std::cout << msg << std::flush;
 }
} // readStdin

 

Edit:

Bør seff generaliseres til å håndtere input fra andre streamer enn cin .. og håndteringsrutinger bør også spesifiseres "utenifra" (generaliseres) ...

Endret av søppel
Skrevet
Lese litt om basic C++.

int står for integer som er tall i C++.

Dersom du vil lese bokstaver kan du bruke char

Bruker en switch i programmet og det krever tydeligvis at option er integer så den kan ikke være char :/

Skrevet (endret)

Skal du både lese inn tegn, strenger og tall bør du lese inn i en std::string og (eventuellt) konvertere til andre typer (int f.eks.) etterpå.

 

#include <iostream>
#include <sstream>


template<typename T1, typename T2>
T1 toType(T2 const& source)
{
        std::stringstream oss;
        oss << source;
        T1 target;
        oss >> target;
        return(target);
} // toType

int main()
{
        using namespace std;

        int i = 1234;
        string s = toType<string>(i);

        cout << s << endl;

        i = toType<int>(s);
        cout << i << endl;

        return(0);
} // main

Endret av søppel
Skrevet (endret)

bare sånn for å pirke, cin returnerer ikke false, den har overloada operator void* for at while(cin>>bah) skal virke..

 

og du kan fint switche en char.. det er bare en tallverdi mellom 0 og 255, eller -128 og 127 om du vil

Endret av saboi
Skrevet (endret)

#include <iostream>

using namespace std;


int main()
{
char option[1];
option[0] = 'a';

switch(*option) {
case 'a':
 cout << "a" << endl;
 break;
default:
 cout << "not a" << endl;
}

return(0);
} // main

 

char* (eller den idiotiske typen char*[]-ett-eller-annet som blir-det-samme-ett-eller-annet) er ikke en integer. char er en integer.

Endret av søppel
Skrevet (endret)

Og du er sikker på at du skriver det slik:

 

char option[1];
cin >> option[0];

// Må ikke være switch(option)
switch (option[0]) { 

// Riktig:
case 'a': 
    cout << "We got an a!\n"; 
    break;

// Galt:
case "b": 
    cout << "We got a b!\n"; 
    break;
}

 

Edit: søppel kom meg i forkjøpet :p

 

søppel: char* argv[] er forresten ikke det samme som char option[]. Det første er en peker til et array av tegn, altså flere "ord", mens det siste bare er ett "ord". (Det blir galt å snakke om ord, men dere skjønner og vet poenget.)

Endret av Myubi
Skrevet (endret)

Hva er egentlig vitsen med å bruke char[1] ???

 

..den kan jo bare inneholde étt tegn.

 

Bruk char option;

 

*doh*

Endret av søppel
Skrevet (endret)

Nei, det var ment generellt.

 

Har han et større array til å lagre strenger i, og skal basere valg på disse strengene går det ikke å bruke switch.

 

men i dunno .. hva som foregår

 

Edit:

ang. char* arg[] kontra char[] .. o.s.v. .. o.s.v., så var det ikke det jeg mente -- det kan være det samme.

Endret av søppel

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...