cin als int



  • Hallo,

    ich habe in meinem Proramm eine Stelle, an der eine Kundennummer angegeben werden muß. Die brauche ich natürlich dann in einer int- Variablen. Später muß ich es zum Ausgeben auf cout auch wieder in string umwandeln. Wie mach ich sowas?

    Marco



  • ich sehe das problem nicht

    int kundennummer;
    cin >> kundennummer;
    //some code...
    cout << kundennummer;
    

    funktioniert doch wunderbar...



  • ich weis ja nicht wo du her hast das man das in einen String umwandeln muss aber ich würde das so machen !

    unsigned int kundennr = 0;
    cin >> kundennr; // Eingabe der kundennr
    // Code in dem die Variable 'kundennr' verwendet wird
    
    cout << kundennr << endl; // ausgabe der Kundennr!
    

    Möge der Code mit dir sein!



  • Ok ich war zu langsam!

    Aber hier noch eine kleine Erklärung!

    cin und cout haben überschriebene Operatoren, d.h. sie sind für verschiedene Typen verwendbar !!



  • Ja, das mit dem int geht, hatte nur was übersehen. Das Problem ist bloß, dass der int später in einer string- Funktion benutzt wird und da ausgegeben werden soll. Uggf so:

    string d() {
      return strvar + " " + intvar + " " + strvar2
    }
    

    Da geht's dann nicht mehr so einfach.



  • Original erstellt von <derAufDieSprüngeHelfer>:
    [QB]cin und cout haben überschriebene Operatoren...QB]

    MEEEP! das muss überladen heissen überschreiben kann man nur vituelle methoden und das hat mit überladen nichts zu tun 😃



  • Quatsch, hab mich vertan, der Fehler ist hier:

    int get_number() const {
                return customer_number;
            }
            string get_name() const {
                return customer_name;
            }
            string display() const {
                string return_value;
                return_value = "Nummer:       " + get_number() + "\nName:         " + get_name() + "\n";
                return return_value;
            }
    

    drittletzte Zeile: cannot add two pointers(?)



  • hmm mit stringstreams geht das recht gut.. dann muss man halt noch ein extrea stringstream objekt in der funktion erstellen was dann 2 zeilen mehr braucht aber davon geht ja die welt auch nicht unter...



  • 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