Problem mit Funktionen

  • C++

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Problem mit Funktionen

    servus, hab ein problem bei einer funktion in c++
    ich wollte eigentlich "nur" eine eingabe darauf prüfen ob ein integerwert eingegeben wurde und wenn es so ist diesen zurück liefern.
    folgendes hatte ich mir ausgedacht.

    Quellcode

    1. int getint(void)
    2. {
    3. int i;
    4. i=0;
    5. cin >> i;
    6. if ( cin.fail()) i=-1;
    7. return i;
    8. }


    die funktion befindet sich in einer schleife welche solange ausgeführt wird wie -1 zurückgeliefert wird.
    das ganze funzt nur leider nicht so wie es soll.
    folgendes passiert:
    ich gebe z.b. ein g ein die funktion liefert folgerichtig -1 zurück.
    jetzt kommt der erneute aufruf und ich kann nichts mehr eingeben.
    wie kann ich dieses problem lösen. hab schon gegooglet.
    ich verwende visual c++ 2008.
    bin für jede hilfe sehr dankbar.
    greetz der f.o.g.
    Blacklist
    Meine UP's
    1 2

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von f.o.g. ()

  • f.o.g. schrieb:

    die funktion befindet sich in einer schleife

    Nein, tut sie nicht.

    f.o.g. schrieb:

    jetzt kommt der erneute aufruf und ich kann nichts mehr eingeben.

    Bei mir nicht.
    Es funktioniert bei mir so: Wenn ich einen int eingebe, wird dieser zurueckgegeben, wenn nicht, dann -1.
    Sonst nix weiter.


    Allerdings verwende ich den g++ Compiler von Cygwin.
    Kannst ja vllt mal das hier probieren:

    Quellcode

    1. int getint(void) {
    2. int i;
    3. if (!(cin >> i)) {
    4. cin.clear();
    5. i = -1;
    6. }
    7. return i;
    8. }



    PS: Wie kommst du darauf ein C++ Problem bei "PHP, MySQL und Perl" reinzustellen? o0
    User helfen Usern: die FSB-Tutoren! (zum Chat) (zur Gruppe)

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Skyte ()

  • zum ersten. hast mich vllt falsch verstanden bzw ich mich falsch ausgedrückt ich hab im hauptprogramm ne schleife welche solange ausgeführt wird wie -1 zurückgegeben wird.
    der erste aufruf erfolgt völlig korrekt es wird -1 zurückgegeben und der aufruf der funktion erneut gestartet. allerdings kann ich jetzt nichts mehr eingeben.:confused:
    bin mal mit dem debugger drüber und der ist einfach über den cin >>i befehl drübergegangen ohne das ich was eingeben konnte.
    bin c++ anfänger habs aber meinem kollegen auf arbeit gezeigt und er meinte es sollte so gehn.
    ps: admin ist bereits wegen falschem forum informiert.
    Blacklist
    Meine UP's
    1 2
  • Aso jo, stimmt, falsch verstanden, sorry.

    Aber wie waers, wenn du gleich ne Funkiton machst, die diese Schleife beinhaltet?

    Quellcode

    1. int getint(void) {
    2. int i = -1;
    3. int err = 1;
    4. while (err) {
    5. if (!(cin >> i)) {
    6. cin.clear();
    7. cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    8. err = 1;
    9. }
    10. else err = 0;
    11. }
    12. return i;
    13. }
    Alles anzeigen
    User helfen Usern: die FSB-Tutoren! (zum Chat) (zur Gruppe)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Skyte ()

  • würde ja gern den ganzen code posten komm aber grad net ran liegt auf arbeit. abgesehn davon ist der ganze code mitlerweile um die 800 zeilen code
    ich hab im hauptprog ne fußgesteuerte schleife welche 2 abbruchbedingungen hat ich hab dann die zweite bedngung testweise mal rausgenommen. desshalb wollte ich die schleife eigenlich nicht in meiner funktion haben aber ich probiers morgen mal aus.
    Blacklist
    Meine UP's
    1 2
  • f.o.g. schrieb:

    hast du mal eine eingabe wie 1g probiert?


    "1g" wird als "1" erkannt. Weiss aber nicht wie man dem auf einfache Weise entgegentreten soll, da auch cin.fail() in dem Fall false ist.

    PS: Allerdings wird (bei der schleifenfreien Variante) auch immer das Problem bleiben, dass man keine "-1" eingeben kann, weil -1 ja der Fehlerwert ist.
    User helfen Usern: die FSB-Tutoren! (zum Chat) (zur Gruppe)

    Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von Skyte ()

  • Wenn der Fehler auch bei einer Eingabe wie "1g" auftreten soll, muss man wahrscheinlich selbst Hand anlegen. Soll heißen: Man liest die Eingabe als String ein und überprüft dann Zeichen für Zeichen, ob es erlaubt ist:

    Quellcode

    1. bool isInteger(String in)
    2. {
    3. if(in.at(0) != 0x2D && (in.at(0) < 0x30 || in.at(0) > 0x39))
    4. return false;
    5. for(int i = 1; i < in.length(); ++i)
    6. {
    7. if(in.at(i) < 0x30 || in.at(i) > 0x39)
    8. return false;
    9. }
    10. return true;
    11. }
    Alles anzeigen
    Hier ein Beispiel von mir, ich konnte es allerdings bisher nicht testen! Des Weiteren müsste zur Nutzung der eingegebenen Zahl diese natürlich anschließend noch (unter Verwendung von Stringstreams) in eine echte Zahl konvertiert werden.
  • Oder eine andere Variante:
    Ich merk mir den String, mach Integer draus, mach wieder String draus und vergleiche.
    Wenn sie nicht gleich sind, dann hing da noch was dran.

    Also das hier funzt jetzt auch mit "1g" und solchen Sachen:

    C-Quellcode

    1. #include <string>
    2. #include <iostream>
    3. #include <sstream>
    4. using namespace std;


    Quellcode

    1. int getint(void) {
    2. int i;
    3. string tmp;
    4. stringstream s1;
    5. cin >> tmp;
    6. s1 << tmp;
    7. if (!(s1 >> i)) {
    8. cin.clear();
    9. cin.ignore(numeric_limits<streamsize>::max(),'\n');
    10. i = -1;
    11. }
    12. else {
    13. s1.clear();
    14. s1.str("");
    15. s1 << i;
    16. if (s1.str() != tmp) i = -1;
    17. }
    18. return i;
    19. }
    Alles anzeigen
    User helfen Usern: die FSB-Tutoren! (zum Chat) (zur Gruppe)

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von Skyte ()

  • Vielen Dank an Skyte der mir sehr weiter geholfen hat vor allem mit seinem letzten Beitrag.
    zwar streikt der compiler bei dieser zeile cin.ignore(numeric_limits<streamsize>::max(),'\n'); ich hab aber dann den ersten parameter durch eine sehr hohe zahl ersetzt.
    kann dann auch zu
    greetz der f.o.g.
    Blacklist
    Meine UP's
    1 2