Int bereich - String eingabe



  • Hab ne for schleife geschriebenn

    am anfang des programmes wird verlangt eine zahl einzugeben..
    wenn man z.b. 5 eingibt, wird 5 mal hinterenander "hello world" geschrieben..

    jetzt will ich mein programm erweitern.. es soll eine fehlermeldung erscheinen wenn man am anfang statt zahl ein buchstabe eingibt..

    (ich kann erst dos programme schreiben)

    MfG
    technology



  • void eingabe(const std::string & txt, double * var)
    {
    do
    {
    if (std::cin.fail())
    { //Fehlerstatus löschen
    std::cin.clear();
    //Eingabepuffer leeren
    std::cin.ignore(std::numeric_limits<int>::max(), '\n');
    }
    //Eingabe-Aufforderung ausgeben
    std::cout << txt;
    //Variable einlesen
    std::cin >> *var;
    } while(std::cin.fail());
    }



  • Wär schön gewesen, du hättest gesagt, wie du es machst/welche Funktion du verwendest.
    Wenn du atoi oder atol verwendest musst du vorher selbst testen, da die beiden im Falle eines Buchstabens einfach 0 zurückliefern.
    Das einfachste ist einfach zu testen, ob die Eingabe nur Ziffern enthält

    #include <ctype.h>
    /*...*/
    string eingabe;
    for (int i = 0; i<eingabe.size()-1; i++){ // size()-1 um das Enter nicht zutesten
      if (!isdigit(eingabe[i])) // Fehler
    }
    

    Wenn die Schleife ohne Fehler durchläuft sind nur Zahlen im String.



  • [cpp]#include <iostream.h>
    int main()
    {
            int i;
            cout << "Geben sie eine Zahl ein.\n";
            cin >> i;
            getchar();
            for (int j = 0; j < i; j++)
            {
              cout << "Hello World\n";
            }
            cout << "\nDrücke ENTER um das Programm zu beende\n";
            getchar();
    }[/cpp]
    

    das ist normalerweise mein code, was du mir da gegeben hast ist echt kompliziert..



  • das ist jetzt mein code..

    [cpp]#include <iostream.h>
    #include <ctype.h>
    int main()
    {
            cout << "Bitte Zahl eingeben\n";
            string eingabe;
            cin >> eingabe;
            getchar();
            for (int i = 0; i < eingabe.size()-1; i++)
            {
                    if (!isdigit(eingabe[1])) {
                            cout << "Bitte ein Zahl eingeben\n";
                            getchar();
            }
            else
            {
            cout << "\nFehler\n";
            getchar();
            }}}[/cpp]
    

    funktioniert aber nicht, könnt ihr mir weitere tipps geben?



  • Mein erster Tipp/Bitte, bitte verwende Code- oder besser noch C++-Tags um deinen Code zu posten, ist besser zum lesen.
    2. Wenn du schon C++ machst, verwende auch C++-Header

    #include <iostream> // Der C++-Header
    #include <ctype.h>
    
    using namespace std; // Benötigt für string und cin/cout
    
    int main()
    {
      string eingabe;
      bool mis; // Soll zeigen, ob ein Fehler gamacht wurde bei der Eingabe
      do { //Beginn der endgeprüften Schleife
        mis = false; // Annahme Eingabe ist korrekt (kein Fehler, darum mis = false)
        cout << "Bitte Zahl eingeben\n";
        cin >> eingabe;
        for (int i = 0; i < eingabe.size(); i++) //Koorektur von mir, Enter wird nicht im String gespeichert
        {
          if (!isdigit(eingabe[i])) { // hier war einer deiner Fehler, nicht eingabe[1], sondern eingabe[i]
            mis = true; // Es wurde ein Fehler gefunden
            break; //Abbruch der for-Schleife
          }
        }
        if (mis) cout << "\nFehler\n"; // Wenn ein Fehler austrat Meldung
      } while (mis); // Ende der endgeprüften Schleife
    }
    


  • imhotep schrieb:

    Wenn du schon C++ machst, verwende auch C++-Header

    Na dann aber auch bitte

    #include <cctype>
    


  • imhotep vielen dank.. dein beitrag ist echt sehr übersichtlich..

    eine frage, ich bin ganz neu in c++. und würde gerne wissen was C++-Header sind?

    Hab dein Code compiliert, funktioniert, aber gibt keine nachricht aus, das programm wird gleich geschlossen..

    nur wenn ich irgendeinen fehler mache (buchstabe eingebe)
    steht dann dort Fehler

    Bitte Zahl eingeben..

    eine kleine hilfe bitte 😞

    MfG
    technology



  • [quote="technology"]

    #include <iostream.h>
    int main()
    {
            int i;
            cout << "Geben sie eine Zahl ein.\n";
            cin >> i;
    

    Dazu muss man vielleicht wissen, dass die iostream's - in diesem Fall der std::istream in Gestalt von 'cin' - bereits intern eine Fehlerbehandlug durchführen. Wenn beim Einlesen ein Fehler aufgetreten ist, so wird stream-intern ein Fehlerflag gesetzt, welches man entweder mit fail() oder einfach mit

    cin >> i;
        if( cin )
        {
            // 'i' ist korrekt gelesen
    

    abfragen kann. Es ist also nicht (!) notwendig, genau genommen sogar ein Fehler, selber die Zeichen einzulesen und zu begutachten, ob eine Zahl vorliegt.

    Dein Code könnte im Prinzip so aussehen:

    #include <iostream>
    
    int main()
    {
        using namespace std; // cout, endl, usw. sind im namespace std definiert
        int i;
        cout << "Geben sie eine Zahl ein.\n";
        cin >> i;
        if( cin )
        {
            for (int j = 0; j < i; j++)
            {
                cout << "Hello World\n";
            }
        }
        else
            cerr << "Die Eingabe war kein Zahl " << endl;
    
        cout << "\nDrücke ENTER um das Programm zu beende\n";
        getchar();
        return 0;
    }
    

    Bleibt noch zu erwähnen, dass man dieses stream-interne Fehlerflag mit clear() - also z.B.: cin.clear() - wieder löschen kann bzw. muss bevor eine weitere Eingabe möglich wird.

    Gruß
    Werner



  • Werner Salomon, danke jetzt verstehe ich es besser.

    Vielen Dank.

    MfG

    technology
    


  • Werner Salomon 👍


Anmelden zum Antworten