Problem mit getline in Klasse



  • Hallo!
    Ich habe einmal eine generelle Frage zum Einlesen eines Strings.

    Mein Code ist wie folgt aufgebaut:

    Klasse.h
    ....

    Member.cpp
    (Funktionen der Klasse)

    main.cpp
    (Hauptprogramm)

    Ich würde nun gerne in der Member.cpp einen String mittels getline(cin, input) einlesen. Der Code funktioniert-ich habe ihn in einem Testprogramm ausprobiert...und habe nun das Gefühl, dass man die getline-Funktion innerhalb Member.cpp nicht benutzen kann. Wenn ich die Funktion in der Member.cpp verwende, dann überspringt daas Programm immer die Benutzereingabe. Woran liegt das?

    Vielen Dank und Grüße von

    Mirjam



  • Was heisst du hast das Gefühl?
    Welche Fehlermeldungen vom Compiler?
    Kannst mal Code zeigen?



  • Mögliche Idee:

    Du probierst den Code nacheinander aus. Dann musst du bei cin erstmal Flags löschen und son Zeug.



  • ........



  • miri schrieb:

    Der Code ist ziemlich lang.....Problem entsteht in der Decrypt Funktion....

    Dann bitte einmal das übliche:
    Reduziere den Code auf das Wesentliche, d.h kürze ihn zusammen, indem du die Dinge, die offensichtlich nichts mit deinem Problem zu tun haben, Schrittweise rauskommentierst. Dabei immer compilieren und sicherstellen dass das Problem noch vorhanden ist. Wenns verschwindet hast du die Ursache auskommentiert, das bringt dich dann vielleicht schon weiter.
    Am Ende, wenn dein Programm schön schlank ist, kannst du uns einige wenige Zeilen posten, bei denen wir dir sicher das Problem finden können. Auf knapp 300 Zeilen Code haben aber die wenigsten Lust hier...



  • Ok...habe ich gemacht. Das Problem tritt auf bei der nun folgenden Funktion
    (Habe alle Funktionen in der main nacheinander auskommentiert und es ist nur bei der Primzahleingabe passiert)

    [code]unsigned long int RSA::Primzahlen()
    {
    	cout << "Geben Sie Primzahl p ein:" << endl;
    	cin >> p;
    	cout << p << endl;
    	cout << "Geben Sie Primzahl q ein:" << endl;
    	cin >> q;
    	cout << q << endl;
    	return 0;
    }[/code]
    


  • Minimales Programm == nötige Informationen ...

    Was ist p, was ist q, warum returnierst du einen unsigned long int wenn du eh immer 0 zurückgibst, was passiert wenn jemand keine Zahl sondern SalatMitSoss333 eingibt?
    Sind wir innerhalb einer Klasse? Sind q und q global?

    Minimal ausführbares Beispiel wäre sowas hier

    #include <iostream>
    
    int main()
    {
       // hier den Code der nicht tut
    }
    

    oder halt

    #include <iostream>
    
    class Meine {
    private:
      int p,q;
    public: 
      Meine() : p(2), q(2) {}
      void Eingabe() { /* ... */ }
      void Ausgabe() { /* ... */ }
    }
    
    int main()
    {
       Meine m;
       m.Eingabe();
       m.Ausgabe();
    }
    

    Dann kann man das in die IDE seiner Wahl überführen, Kompilieren und dann Rat erteilen 😉



  • Ich hatte nun eben meinen ewig langen Code gelöscht, weil sich ja keiner 300 Zeilen anschauen möchte.

    Der Code besteht aus mehreren Memberfunktionen, einer Klasse und einem MainProgramm, welches die Funktionen aufruft...

    Die Primzahleingabe kann ich nicht ins Mainprogramm nehmen, da ich dort noch eine Primzahlgenerierung einbaue und andere Funktionen der Klasse auf diese zugreifen....

    Deshalb steht es nicht in der Main.

    Soll ich nun meinen ewig langen Code doch noch einmal posten?



  • Nein du sollst ihn solange kürzen wie dein Fehler vorhanden bleibt. Und 300 Zeilen ist ja nicht viel nur sind Helfer idr faul und haben besseres zu tuen.



  • OK.....also minimiert entsteht der Fehler in folgender Konfiguration:

    [code]#pragma once
    
    class RSA
    {
    public:
    
    	RSA (void);
    	~RSA (void);
    	// Primzahl p
    	unsigned long int p;
    	// Primzahl q
    	unsigned long int q;
    	// Primzahleingabe (wird noch überarbeitet-automatische Generierung)
    	unsigned long int Primzahlen();
    	//Öffentlicher Schlüssel
    	unsigned long int e;
    	//RSA-Modul
    	unsigned long int n;
    	//Verschlüsselungsfunktion
    	unsigned long int Decrypt();
    
    private:
    	//Privater Schlüssel d
    	unsigned long int d;
    
    };
    [/code]
    
    [code]#include "RSA.h"
    #include <iostream>
    #include <cmath>
    #include <string>
    #include <sstream>
    
    using namespace std;
    
    //Potenzfunktion
    unsigned long int my_pow(unsigned long int base, unsigned long int exp) 
    { 
      if(exp == 0) 
        return 1; 
    
      unsigned long int ret_val = 1; 
    
      for(; exp > 1; exp /= 2) 
      { 
        if(exp%2) 
          ret_val *= base; 
    
        base *= base; 
      }; 
    
      return ret_val * base; 
    }
    
    unsigned long int my_pow2(unsigned long int base, unsigned long int exp, unsigned long int n) 
    { 
      if(exp == 0) 
        return 1; 
    
      unsigned long int ret_val = 1; 
    
      for (int i=0; i<exp; i++) {
    	  ret_val*=base;
    	  ret_val=ret_val%n;
      }
    
      return ret_val; 
    }
    
    //Konstruktor
    RSA::RSA(void)
    {}
    //Destruktor
    RSA::~RSA(void)
    {}
    
    //Eingabe zweier Primzahlen
    unsigned long int RSA::Primzahlen()
    {
    	cout << "Geben Sie Primzahl p ein:" << endl;
    	cin >> p;
    	cout << p << endl;
    	cout << "Geben Sie Primzahl q ein:" << endl;
    	cin >> q;
    	cout << q << endl;
    	return 0;
    }
    
    //Verschlüsselung
    unsigned long int RSA::Decrypt()
    {
    	int const maximal=1000;
    	unsigned long int c[maximal]={0};
    
    	cout << "Geben Sie ein zu verschluesselndes Wort (max 1000 Zeichen) ein:" << endl;	
    	string input;
    	getline (cin, input);
    	cout << "Der ASCII Code fuer das Wort lautet:" << endl;
    	for(int i=0; i<input.length(); i++)
    	{
    	cout<<int(input.at(i))<<" ";
    	}
    	cout << endl;
    	return 0;
    
    	//ASCII verschlüsseln
    	cout << "Das verschluesselte Wort lautet:" << endl;
    	for (int x=0; x<input.length(); x++) {
    	c[x]=my_pow2(int(input.at(x)),e,n);
    
    	cout << c[x] << " ";
    
    	}
    	cout << endl;
    	//return c;
    	return 0;
    }
    [/code]
    
    [code]#include <iostream>
    #include <string>
    #include <sstream>
    #include "RSA.h"
    
    using namespace std;
    
    int main()
    {
    	cout << "hallo Welt" << endl;
    	RSA emil;
    	emil.Primzahlen();
    	emil.Decrypt();
    
    	return 0;
    }
    [/code]
    


  • Was ist deine Eingabe und was die Ausgabe?
    Was ich momentan an möglichen Fehlern sehe:
    - in Primzahlen() liest du zwei Zahlen ein und vertraust dem User, dass er auch wirklich (Prim)Zahlen eintippt. Wenn jemand buchstaben eintippt kommen Fehler, weil du cin danach nicht resettest.
    - in Decrypt() hast du toten Code, weil mittendrin ein return steht.

    Was das kürzen angeht üben wir das nochmal 😉 Soweit ich sehe werden die mypow-funktionen garnicht benutzt - hättest du uns also auch ersparen können 😉
    Aber der Wille zählt schonmal 🙂



  • Ich kann mich nur wiederholen:
    Die automatische Primzahlgenerierung habe ich als Roh-Code zu liegen....ist nur noch nicht eingebaut. Dies ist jetzt ein Testprogramm für das Forum hier und natürlich muss man dann auch zwei Primzahlen eingeben und keine Buchstaben bzw. Sonstiges....

    Bezüglich dem return:
    Habe ich rausgelöscht-Fehler liegt dennoch weiter vor.

    Fehler heißt hierbei nicht, dass das Programm nicht durchläuft, sondern dass das Programm den Befehl: getline(cin, input) einfach überspringt und nicht wartet, bis der Benutzer eingegeben hat.

    Dies ist das Problem und ich hoffe in dieser Hinsicht auf konstruktive Kritik.
    Vielen Dank

    PS: Zumindest my_pow2 wird benutzt.....



  • ich habs mal durchdebuggt und bin auf folgendes gestoßen: nach dem "cin>>q" befindet sich im stream cin aus weiß der Henker was für Gründen noch ein '\n'.
    Da das aber der Delimiter ist für das getline, liest getline genau 0 Zeichen und aus die Maus.
    Warum dem so ist seh ich grade nicht - Brett vorm Kopp.



  • Hmm. Das ist merkwürdig-leider hab ich wirklich zu wenig Ahnung, um mit diesem Ratschlag weiterzukommen:-(. Aber es ist zumindest schon einmal ein Schritt vorwärts!
    Ich wäre hoch erfreut, wenn Du die Lösung finden würdest!



  • Also ich habe das Problem jetzt wie folgt gelöst:

    [code]cin.ignore(1,'\n');[/code]
    

    Dieser Befehl befindet sich in der Funktion RSA::Primzahlen. Ich weiß aber nicht, ob das legitim ist? Kann man das so machen? Oder bekommt man dann anderweitig Probleme?


Anmelden zum Antworten