Frage zu getline

benni miles

Mitglied
Hi,

habe hier ein kleines Script das überprüft ob das eingegebene Wort ein Palindrom ist oder eben nicht. Funktioniert soweit auch nur wenn ich nocheinmal ein Wort eingeben will sprich die do while Schleife nochmal durchläuft, wird getline ignoriert und er nimmt die Eingabe die beim ersten mal getätigt wurde. Kann mir wer sagen warum das so ist.

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

int main()
{
  string input, checkstring;
  int max;
  bool check = true;
  char button = 'j';
  do
  {
    getline(cin, input);
    checkstring = input;
    max = input.length() - 1;
	
	for(int i = 0, j = max; (i <= max) && check; ++i, --j)
    { 
      if(input[i] != checkstring[j])
	    check = false;
    }
    if(check)
      cout << "Es handelt sich um ein Palindrom" << endl;
    else
      cout << "Kein Palindrom" << endl;
	  
	cout << "Noch einmal überprüfen <j> <n>: ";
	cin.get(button);
  }
  while(button == 'j' || button == 'J');
	
  return 0;
}

lg
 
Zuletzt bearbeitet:
Hallo benni miles,

das liegt daran das der Buffer noch belegt ist. Vermultlich mit dem eingegebenen 'j' oder 'J'.
Abhilfe schafft hier die Leerung des Buffers.

C++:
std::cin.clear(); // Setzt das error control flag auf goodbit
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // maximale Anzahl der Zeichen im Stream(buffer) ignorieren.

Übrigens ein Palindrome wäre doch auch ein Wort mit ungerader Anzahl Zeichen ? z.B. ada oder abcdcba (glaub ich zumindest)

@offtopic hast du zur Zeit diskrete Mathematik ? ->HA :)

mfg
 
Hi.
das liegt daran das der Buffer noch belegt ist. Vermultlich mit dem eingegebenen 'j' oder 'J'.
Nein, das j/J ist bereits ausgelesen, aber es folgt noch ein Newline Zeichen (@benni miles: nach Eingabe von j/J hast du ja Enter gedrückt, oder?!). Das führt dann dazu, das eine Leerzeile eingelesen wird. Es wird also nicht wie vermutet die letzte Zeile nochmal verarbeitet, sondern eine Leerzeile.

Der nächste Fehler ist, dass die Variable check vor der inneren Schleife nicht wieder auf true gesetzt wird. Da wäre es besser den Palindrom-Check in eine eigene Funktion auszulagern.

Dann solltest bei jeder Eingabeoperation prüfen, ob überhaupt etwas eingelesen wurde:
C++:
string zeile;
while (getline(cin, zeile)) {
  if (ist_palindrom(zeile)) {
    cout << "ist ein Palindrom" << endl;
  } else {
    cout << "ist kein Palindrom" << endl;
  }
  char ch;
  if (cin.get(ch) && (ch == 'j' || ch == 'J')) {
    getline(cin, line); // restliche Zeile lesen
  } else {
    break; // Eingabefehler oder Eingabe /= [j|J]
  }
}
Übrigens ein Palindrome wäre doch auch ein Wort mit ungerader Anzahl Zeichen ? z.B. ada oder abcdcba (glaub ich zumindest)
Ja, natürlich. palindrom(X) <=> X == reverse(X)

Meinst du der Algorithmus funktioniert nicht bei Worten mit ungerader Länge?

Gruß
 
Zurück