cin als int



  • Sorry natürlich Überladen überschrieben!



  • Hi

    Ich versteh das Problem auch nciht ganz. Aber vielleicht willst du nur eine int -> Sting? Dazu gibts glcub ich im FAQ-teil was.

    Aber das wäre auch einfach (wenn du das suchst):

    char puff[50];
    sprintf(puff,"%d", Intvariable);

    Grüße Flow



  • @Flow_cplus

    das ist aber C und kein C++ wenn er eine reine C++ Lösung sucht sollte er die stringstreams nehmen



  • Die String Stream beziehen sich doch direkt auf cout oder nicht? Ich sollte dazu sagen, dass ich ziemlicher Anfänger bin (erstes Zeichen in c++ vor 2 Tagen). Ich habe einfach diese Funktion display(), die ja als string- Funktion deklariert ist und aus name (string) und get_number() (int) was zusammensetzen soll wie bspw. Meier 10 und das zurückgeben soll. Zum cout komme ich erst später woanders.

    [ Dieser Beitrag wurde am 03.05.2003 um 20:05 Uhr von marcoow editiert. ]



  • das liegt daran das der + operator nur für string objekte überladen ist.
    schreibt man aber

    "blablabla"
    

    ist das nicht ein object der klasse string sondern ein char*, sprich ein pointer auf ein char array und pointer kann man nun mal nicht addieren...
    jenachdem kann man das umgehen in dem man expliziit string objekte erzeugt:

    return_value = string("Nummer:       ") + get_number() + string("\nName:         ") + get_name() + string("\n");
    

    allerdings geht das nur unter voraussetzung das get_number auch einen string liefert.. (und es gibt überflüssig viel konstruktoraufrufe und dementsprechend auch destruktor aufrufe...)
    also würde man das mit stringstreams wohl so lösen:

    string display() const {
                ostringstream return_value;
                return_value << "Nummer:       " << get_number() << "\nName:         " << get_name() << endl;
                return return_value.str();
            }
    

    im übrigen würde ich die namensgebung nochmal überdenken denn wenn eine funktion display heist erwarte ich eigentlich das die funktion selber den string ausgibt und ihn nicht zurückliefert... (wobei das ist natürlich geschmackssache)

    mfg japro

    [ Dieser Beitrag wurde am 03.05.2003 um 20:09 Uhr von japro editiert. ]



  • Alles klar, ich hab's hingekriegt. Jetzt habe ich nur noch ein Problem: Wie kann ich checken, ob das was eingegeben wurde tatsächlich ein Zahl ist? Ich dachte, es geht so:

    int get_int_input(string title) {
        int return_value;
        cout << title;
        cin >> return_value;
        if (!isdigit(return_value)) {
            cout << "ungueltige Eingabe";
            get_int_input(title);
        }
        return return_value;
    }
    

    Einen Fehler beim Debuggen oder Builden gibt es nicht, aber mein Programm stürzt genau an der Stelle ab.



  • tu mal

    cin.clear ();
    cin.ignore (cin.rdbuf()->in_avail());
    

    an den anfang deiner funktion.
    ich vermute, dass wenn du etwas falsches eingibst, der eingabebuffer von cin nicht geleert wird, du rufst die funktion nochmal auf, diesmal hast du nichtmal die chance was einzugeben, weil ja noch was im buffer ist, und dann eben wieder sich selbst aufruft und von vorne -> schonmal

    void foo () { return foo(); }

    ausporbiert?



  • Ich hab's jetzt so:

    int get_int_input(string title) {
        int return_value;
        cin.clear ();
        cin.ignore (cin.rdbuf()->in_avail());
        cout << title;
        cin >> return_value;
        if (!isdigit(return_value)) {
        cout << "ungueltige Eingabe";
        get_int_input(title);
      }
        return return_value;
    }
    

    Stürzt trotzdem ab.



  • ach... schon wieder mein fehler 🙄 tut leid:
    hab einfahc nur kurz geantwortet (standard antwort gegeben)

    int ret_val;
    
    cin >> ret_val;
    

    ist sicher! ret_val ist auf jedenfall eine zahl! mit isdigit prüfst du , ob ein char eine ziffer ist (ziffer!=zahl)

    wenn die eingabe fehlschlägt, dann wird ret_val NICHT angetastet (von cin) und ein fail bit gesetzt.

    int get_int_input() {
    
        int ret_val = 0;
    
        do {
            cin.clear(); //manche brauchen das und
            cin.ignore(cin.rdbuf()->in_avail()); //das
    
            cin.sync(); //, manche (compiler) brauchen das
    
            cin >> ret_val;
    
        } while (!cin);
    
        return ret_val;
    }
    


  • ganz easy, isdigit erwartet ein char (sagen dir asscii was?) oder EOF

    void clear_cin()
    {
        cin.clear();
        cin.ignore( cin.rdbuf()->in_avail() );
    }
    
    int get_int_input(const string & title) 
    {
        clear_cin();
        int return_value;
        cout << title;
        cin >> return_value;
        while(cin.fail())
        {
            clear_cin();
            cout << "ungueltige Eingabe, probiers nochmal\n";
            cin >> return_value;
        }
        return return_value;
    }
    

    *wird mal zeit das ich ein FAQ thread zu streams schreibe*


Anmelden zum Antworten