Eingabeaufforderung in der Konsole beenden und weiter im Programm



  • Hallo liebe Community,
    ich habe, wie es sich bereits im Titel andeutet das Problem, dass ich die Eingabeaufforderung nicht beenden kann.

    Der Code:

    void Stechkarte::einlesen(void)
    {
    	char std_[5];
    	char min_[5];
    
    	cout << "Stunden und Minuten eingeben (std:min)" << endl;
    
    	do
    	{
    		cin.getline(std_, 50, ':');
    		cin.getline(min_, 50);
    
    		std += atoi(std_);
    		min += atoi(min_);
    	} while (std_ || min_ != "stop");
    
    	cout << "gestoppt!!" << endl;
    }
    

    std und min sind private Variablen der Klasse, die jeweils mit 0 initialisiert wurden. Das einlesen funktioniert soweit, und es wird auch alles ordnungsgemäß in den Variablen abgelegt. Doch wie erkläre ich ihm, dass er nach keiner weiteren Eingabe warten soll, wenn er einen bestimmten string einliest wie "stop" z.B.

    Danke im vorraus für eure Hilfe!

    Gruß



  • Kurze Antwort: du kannst C-Strings nicht per == vergleichen. Dafür solltest du std::string verwenden, da passieren dir diese ganzen Probleme nicht.

    Symptome: Verwenden von C-Funktionen, C-Strings, Stechkarten die einlesen können und Wurstbroten, die Supermärkte sind, void-Parameter
    Diagnose: Wolf
    Therapie: Aktuelles Buch wegwerfen (vmtl. Wolf), damit der Schaden begrenzt bleibt.



  • Jodocus schrieb:

    Kurze Antwort: du kannst C-Strings nicht per == vergleichen.

    Selbst wenn das ginge, wäre die Bedingung immer noch verkehrt.

    Du hast: 'Wenn std_ oder min_ ungleich "stop" ' Du möchtest wohl
    'Wenn std_ ungleich "stop" oder min_ ungleich "stop" ' haben. Oder sollte da ein und hin?



  • DirkB schrieb:

    Jodocus schrieb:

    Kurze Antwort: du kannst C-Strings nicht per == vergleichen.

    Selbst wenn das ginge, wäre die Bedingung immer noch verkehrt.

    Schon klar, aber der TE hat erst mal ganz andere Probleme.



  • Normalerweise benutze ich immer std::string und auch std::vector. Jedoch entschied ich mich hier für C-Strings, weil die Parameterliste von cin.getline() das so haben wollte. Kommt noch hinzu, dass atoi() ebenfalls nur C-Strings als Parameter annimmt.

    Beides sind Funktionen, die uns unser Prof gezeigt hat...

    "Diagnose: Wolf" ist richtig. Breymann und andere Fachliteratur waren in der Hochschulbibliothek vergriffen.


  • Mod

    xxlsuelo schrieb:

    Jedoch entschied ich mich hier für C-Strings, weil die Parameterliste von cin.getline() das so haben wollte.

    Es gibt auch getline für strings.

    Kommt noch hinzu, dass atoi() ebenfalls nur C-Strings als Parameter annimmt.

    atoi ist ja auch so ziemlich die letzte Methode für diesen Einsatzzweck. stoi arbeitet mit std::string und bietet im Gegensatz zu atoi auch eine annehmbare Fehlerbehandlung. Und selbst wenn, kann man sich mit c_str jederzeit aus einem std::string einen C-String machen.

    Erfahrungsgemäß ist aber der Wille zum Einsatz von atoi (und stoi) fast immer darauf zurück zu führen, dass jemand aus irgendeinem Grund erst eine Zeichenkette aus einem Stream liest und die dann in eine Zahl umwandeln möchte, anstatt sofort eine Zahl aus dem Stream zu lesen. So auch hier. Wieso nicht einfach direkt die Zahlen einlesen? Wozu dieser Umweg über drei Ecken?

    Beides sind Funktionen, die uns unser Prof gezeigt hat...

    "Diagnose: Wolf" ist richtig.

    Ihr Armen. Gleich vom Anfang an dazu verdammt, niemals richtig C++ zu lernen und dann nach ein paar Monaten frustriert alles hin zu werfen.



  • Erstmal danke für die Hilfe! Ich werde die vorgeschlagenen Funktionen mal austesten.

    SeppJ schrieb:

    Ihr Armen. Gleich vom Anfang an dazu verdammt, niemals richtig C++ zu lernen und dann nach ein paar Monaten frustriert alles hin zu werfen.

    Mag vielleicht in einigen Fällen zuzutreffen.


Anmelden zum Antworten