Gå til innhold

[Løst]hvordan finne ut om det er ett tall i cin, og spørsmål om std::endl


Anbefalte innlegg

skulle lage ett script som skulle bare spørre brukeren om hvor mange "linijer ned" consolen skulle gå, så klaget den på

std::endl;

så spørsmål 1: hvorfor trenger "std::endl" og starte med "std::cout" ?

den sier "error: statement cannot resolve address of overloaded function"

(ikke at det er noe problem og bruke std::cout << std::endl;, bare høres unødvendig ut :hmm: )

 

spørsmål 2: bruker std::string og std::cin, men hvordan kan jeg lage en-eller-annen error hvis det ikke er ett nummer som er puttet in? (jeg prøvde uten, programmet krasjer ikke, ingen error etc, når jeg putter "blabla" i std::cin >> EnInt; , EnInt blir bare 0)

Endret av Hans_Henrik
Lenke til kommentar
Videoannonse
Annonse

1. std::endl må sendes til en stream, hvilke stream skal den sendes til? Den finner ikke det ut automatisk :)

2. Jeg husker ikke helt hvordan man gjør det i c++, men her er funksjonene for C

 

String conversion:

atofConvert string to double (function)

atoiConvert string to integer (function)

atolConvert string to long integer (function)

strtodConvert string to double (function)

strtolConvert string to long integer (function)

strtoulConvert string to unsigned long integer (function)

Endret av Giddion
Lenke til kommentar
skulle lage ett script som skulle bare spørre brukeren om hvor mange "linijer ned" consolen skulle gå, så klaget den på

std::endl;

så spørsmål 1: hvorfor trenger "std::endl" og starte med "std::cout" ?

 

Grrr... "Å starte". å, Å, ÅÅÅÅÅÅÅ! Måtte lese Giddion sitt svar først for å forstå spørsmålet.

 

den sier "error: statement cannot resolve address of overloaded function"

(ikke at det er noe problem og bruke std::cout << std::endl;, bare høres unødvendig ut :hmm: )

 

Unødvendig? Nuvel. Du kan bruke std::endl(std::cout), hvis det er enklere, men hvilken IO stream skulle endl gjøre widen + flush på, når du ikke sier noe?

 

spørsmål 2: bruker std::string og std::cin, men hvordan kan jeg lage en-eller-annen error hvis det ikke er ett nummer som er puttet in? (jeg prøvde uten, programmet krasjer ikke, ingen error etc, når jeg putter "blabla" i std::cin >> EnInt; , EnInt blir bare 0)

 

Du kan sjekke stream state:

 

if ( !(std::cin >> count ) )
std::cerr << "Input failed\n";

 

(det er et litt mer spennende spørsmål om hva man gjør med stream-tilstanden, og hvordan man kan gjøre noe fornuftig etter å ha oppdaget feilen). En interessant bok som tar for seg IO i C++ er "C++ IO streams and locales" av Langer og Kreft.

Lenke til kommentar
  • 2 uker senere...
ville det ikke være greiere for deg å bruke en header så du slipper skrive std:: hele tiden?

#include <iostream> er handy vettu. ^^

 

... bortsett fra at #include <iostream> ikke inneholder using directive for std-navnerommet. #include <iostream> er nødvendig, men include-direktivet hjelper ikke hva std::-navnerommet angår.

Lenke til kommentar

om du skriver

 

using namespace std;

 

over main'en din, så slipper du å skrive std:: forran cin/cout.

 

Det regnes ikke som god programmeringsskikk å legge using namespace ... i header filer. da forsvinner poenget med namespaces helt.

Lenke til kommentar

@namespace

vell, jeg synes også at det gjør det vanskeligere for andre og forstå "eksempel-koder" når namespace er brukt i store koder..

 

namespace std;
namespace boost;
(flere namespace's her)
(noen titals koder)
getline(cin, find_last(s, "blabla"));

og så en fyr som skal bare se akkurat hvordan den ene linjen virker:

getline what???

find_last whaa???

 

o-s-v :p

så jeg liker faktisk ikke den namespace greia så veldig...

Lenke til kommentar
namespace std er nesten standard å ha med

 

Nei, her tar du feil. I public libraries i c++ bruker man ikke using ... blah, for dette gjør så alt kommer i global scope.

 

For å illustrere hvorfor using namespace whatever sjelden eller aldri brukes i public libraries og profesjonelle produkter. Tenk deg at du har skrevet et biblotek der du tar nytte av at std::map sin implementasjon fungerer som en insert update.. (ie: navnAlderLookup[navn] = 12; // her vil enteries lages om det ikke finnes, hvis ikke vil enterien oppdateres). Om du ikke skriver std::map<std::string, uint32> navnAlder, og heller map<string, uint32> navnAlder; kan du få en helt annen implementasjon av map enn den du tror, som kanskje av optimerinsgrunner ikke har denne funksjonaliteten som er helt nødvendig for at koden din skal funke.

 

og man sparer mye tid.

Vil du spare tid så bruk typedefs.

typedef std::map<std::string, uint32> navnLookupMap_t;

 

eller installer visual assist.

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