If Anweisung prüfen ob Variable eine Zahl ist



  • Ups sorry, wegen oben, das cin.getline gehört natürlich nicht rein, wenn man den string chon als parameter bekommt.

    wenn du das als if abfrage formulierst kannst du einfach die funktion in die if klammern schreiben, du musst nur dafür sorgen, dass zahl nur zugewiesen wird, wenn eine zahl im string war, also wenn

    i < (strlen(string)-1)
    

    , ansonsten gib zahl einfach so zurück, denn eine 0 wird im if als negativ interpretiert



  • int zahl_rausbekommen(char *string){
        int i = 0;
        int zahl = 0;
    
        cin.getline(string, 100);
    
        for(i=0;string[i]<'0' || string[i] > '9';i++){}//läuft so lange bis es auf eine ziffer trifft wenn er auf eine trifft hast du sie direkt zugriff auf sie weil i dann an der stelle steht
    
        zahl = string[i] - '0'; //und so kannst du die zahl direkt in einen integer umwandeln, weil das ascii zeichen '0' den wert abzieht damit du auf den richtigen int-wert kommst
        return zahl;
    }
    

    also das ist so nen murks 😛 Gib mal nen String rein, der keine Zahl enthält!

    void get_number(std::string const & string, int& dest)
    {
        const std::string::size_type pos(string.find_first_of("0123456789"));
        if (pos == std::string::npos) throw std::invalid_argument("no number found");
        std::istringstream ss(string.substr(pos));
        if (!(ss >> dest)) throw std::runtime_error("could not convert to integer");
    }
    

    oder so sollte gehen ...



  • Ja, das ist mir dann ja auch aufgefallen, aber weil editieren nicht möglich ist, habe ich das im 2ten post dann ja gesagt



  • Also ich will das mit ner Eingabe machen. Problem: Ich will machen, dass wenn man bei folgendem Code einen Buchstaben eingibt, eine Fehlermeldung kommt und nicht gleich alles unendlich mal ausgeführt wird:

    // Quadratzahlen berechnen
    #include <iostream>
    using namespace std;

    int main()
    {
    double eingabe; // Schleifenvariable

    eingabe = 1;

    while (1)
    {
    cout << "Programm zur Berechnung von Quadratzahlen" << endl;
    cout << "Geben Sie eine Zahl ein ( 0 zum Beenden ): ";

    cin >> eingabe;

    if (eingabe == 0)
    break;

    cout << "Das Quadrat von " << eingabe
    << " ist " << eingabe * eingabe << endl;
    cout << endl;

    }

    return 0;
    }



  • wenns geht dann auch gleich noch die benötigte Headerdatei angeben, falls benötigt



  • hmm einfach forensuche bemühen ... ^^ ist mitlerweile 0815 Thema der Woche ^^

    Gucken ob eingabe erfolgreich war (!std::cin), d.h. etwas eingegeben wurde, dass man in einen double konvertieren kann. Wenn es nicht geklappt hat, das ausgeben und Stream zurücksetzen(std::cin.clear(), std::cin.ignore(std::numeric_limitsstd::streamsize::max(), '\n')). Jetzt kannst du nochmal versuchen eine Zahl einzulesen.



  • Lies einen String ein, konvertiere den String selbst nach double, und überprüfe ob die Konvertierung hingehaut hat.
    Eine Möglichkeit:

    std::string str;
    std::cin >> str;
    if (!std::cin)
        input_error();
    try
    {
        double d = boost::lexical_cast<double>(str);
    }
    catch (std::exception const&)
    {
        war_keine_zahl();
    }
    


  • Naja warum so aufwendig? Das ist ja Performance Verlust pur. lexical_cast nutzt ja auch nur die Streamoperatoren und da kannst du besser direkt gucken ob das Einlesen geklappt hat(also std::cin überprüfen!) ...



  • Und warum nicht gleich atoi verwenden, oder sscanf?
    Blubb.

    Ja, es gibt mehrere Möglichkeiten.

    Erstmal nen String lesen und dann umwandlungen selbst machen ist oft die beste, da man so schön prüfen kann wo der Fehler liegt, also ob z.B. der Input Stream leer war, oder aber etwas eingegeben wurde was nicht als Zahl interpretiert werden konnte etc.



  • dann aber mit getline



  • .......... schrieb:

    dann aber mit getline

    Da hast du wohl Recht 🙂


Anmelden zum Antworten