Gå til innhold

Program klikker helt av input


Anbefalte innlegg

Videoannonse
Annonse

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
Lenke til kommentar

	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
Lenke til kommentar

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
Lenke til kommentar

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
Lenke til kommentar

#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
Lenke til kommentar

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
Lenke til kommentar

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
Lenke til kommentar

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...