g++ Compiler

tipster

Grünschnabel
Hallo!

Ich hab ein merkwürdiges Problem und kann mir nicht erklären woran es liegt. Folgendes simples Progamm:

Code:
#include <iostream>
#include <string>
#include <cctype>
using namespace std;

int menu();

int main()
{
    int test = 0;

    while(test != 'B')
    {
        test = menu();
    }

    return 0;
}
int menu()
{
   static char menuStr[] =
   "\n\n             B = Beenden des Programms"
   "\n\n Ihre Wahl:  ";

   cout << menuStr;
   char wahl;
   cin.sync(); cin.clear(); // Nur neue Eingabe
   if( !cin.get(wahl))
      wahl = 'B';
   else
      wahl = toupper(wahl);

   cin.sync();              // Eingabepuffer löschen
   return wahl;
}

Mein Problem ist nun wenn ich es mit g++ kompiliere und starte reagiert die Eingabe ganz komisch. Wenn ich exemplarisch den Wert 'a' eingebe wird die Schleife nicht einmal durchgegangen wie erwartet, sondern es wird sofort ein zweites Mal mit einem Leerwert durchgegangen (siehe Anhang). Die Schleife geht also immer einmal mehr als gewollt mit irgendwelchen Werten durch als würde noch etwas im istream hängen. Wenn ich dieses Programm unter Visual Studios starte funktioniert alles wie gewollt. Ich würde allerdings gerne mit Netbeans und dem g++ Compiler entwickeln und hoffe daher das mir jemand dieses Verhalten erklären kann und mich aufklärt was ich falsch mache :) Ich danke im Voraus!

lg
 

Anhänge

  • console.png
    console.png
    17,1 KB · Aufrufe: 38
Hi.

Welche Version von g++ hast du denn? (g++ --version) MinGW oder Cygwin?

Mit der 4.5.0 MinGW und der 4.3.0 MinGW Version hab ich hier keine Probleme und dein Programm funktioniert.

Mit dem Cygwin g++ 4.3.4 gibt es das von dir beschriebene Problem.

Gruß
 
Hi!

Danke für die Antwort! Genau es handelt sich um den cygwin 4.3.4 Compiler. Weißt du an was das liegen könnte oder sollte ich einfach zum MinGW wechseln?

lg
 
Hi.

Vermutlich liegt es an der zugrundeliegenden Implementierung der Ein/Ausgabeströme die unter Cygwin mit Pipes realisiert ist.

Wenn du nicht wirklich Cygwin als UNIX-Kompatibilitätsschicht benötigst, dann wechsle doch einfach zu MinGW.

Du könntest statt sync() auch ignore() verwenden um den Rest einer eingegebenen Zeile zu ignorieren:
C++:
inline ::std::istream& ignore_line(::std::istream& in) {
  return in.ignore(::std::numeric_limits<::std::streamsize>::max(), '\n');
}
Oder du liest immer eine komplette Zeile ein und verarbeitest diese.

Gruß
 
Zurück