Avatar billede egede Nybegynder
31. august 2004 - 11:04 Der er 12 kommentarer og
1 løsning

Forkert ind på inputbufferen

Hej,

Hvordan checker og tømmer man lettest inputbufferen hvis at der er noget der 'sidder' fast?

ex
int a;
cin >> a;

Med en char som input...
Avatar billede segmose Nybegynder
31. august 2004 - 11:27 #1
fflush(stdin);  // frit efter manglende hukommelse.
Avatar billede bertelbrander Novice
31. august 2004 - 20:23 #2
Man kan ikke flush'e en input stream.

Den smarteste måde at løse problemet på er at lave en lille funktion der læser en linie og forsøger at konvertere dette til en int. F.ex noget i stil med:

#include <iostream>
#include <string>
#include <sstream>

template <typename T>
bool Get(T &t)
{
  std::string s;
  std::getline(std::cin, s);
  std::stringstream ss(s);
  return ss >> t;
}

int main()
{
  int x;
  std::cout << "Enter a integer: ";
  if(Get(x))
    std::cout << "You Managed to enter: " << x << std::endl;
  double d;
  std::cout << "Enter a double: ";
  if(Get(d))
    std::cout << "You Managed to enter: " << d << std::endl;
}
Avatar billede egede Nybegynder
03. september 2004 - 13:15 #3
Hej, undskyld svartiden.

bertelbrander <- Din kode virker fint, bortset fra når jeg kalder funktionen fra en anden funktion, så får jeg ikke lov til at indtaste noget før den springer videre i koden, hvorfor skyldes det?
Avatar billede bertelbrander Novice
03. september 2004 - 19:37 #4
Det mest sansynlige er at der hænger noget i indput bufferen når du kalder funktionen.

Det eneste rigtige fix er at bruge getline til ALLE læsninger fra tastaturet.
Avatar billede egede Nybegynder
05. september 2004 - 15:48 #5
okay, jeg vil finde en løsning på det... Hvis du lægget et svar kan du få dine point...
Avatar billede bertelbrander Novice
05. september 2004 - 16:12 #6
Jeg vil helst ikke have point.
Avatar billede egede Nybegynder
06. september 2004 - 20:17 #7
Som du vil :)
Avatar billede egede Nybegynder
15. september 2004 - 21:22 #8
fik forresten funktionen til at virke fuldstændigt ved at sætte

fflush(stdin);

for jeg vendtede på input...
Avatar billede bertelbrander Novice
15. september 2004 - 21:55 #9
Så burde seqmose jo have point.
Men tricket virker ikke med alle kompilere på alle platforme.

I C-standarden står der:

7.19.5.2 The fflush function
Synopsis
#include <stdio.h>
int fflush(FILE *stream);
Description
If stream points to an output stream or an update stream in which the most recent operation was not input, the fflush function causes any unwritten data for that stream
to be delivered to the host environment to be written to the file; otherwise, the behavior is undefined.
Avatar billede segmose Nybegynder
16. september 2004 - 13:10 #10
Det kan lære mig ikke at stole på min compileren egen beskrivelse!
(vi taler vel C99 her.)
Avatar billede bertelbrander Novice
16. september 2004 - 19:53 #11
Hverken ANSI C89, ISO C90, ANSI C99 eller ANSI C++ (der er vist kun en) definerer flush for input streams.

At det er udefineret betyder at ALT kan ske, fra at den gør det du forventer til at den kalder ParkTheHarddiskHeadBelowTheSurface() ;-)
Avatar billede egede Nybegynder
16. september 2004 - 23:08 #12
Rammende beskrivelse :)

Anyway, segmose, hvis du vil have point skal du da få det...?
Avatar billede segmose Nybegynder
17. september 2004 - 11:50 #13
Springer over denne gang det er jo ikke rigtigt ifølge standard sådan noget kan man ikke give point for.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester