char into int bzw systemcrash verhindern bei eingabe von strings in eine int....



  • Hey,

    ich habe da eine Frage...nein eigentlich zwei... die aber beide das gleiche Problem lösen sollen...

    also Nr1: Kann ich eine char..... (z.b. char = 1) in eine int umwandeln? Also das die int nun den wert 1 hat.....
    ca so:

    char eins;
    int zwei;
    cin >> zwei;
    if(!isalpha(eins)) zwei = eins;
    

    nur leider wird dann die int zu einer ganz anderen Zahl 😮

    und Nr.2:

    int action = 0;
                for(;;)
                {
                cin >> action;
                if(!isalpha(action)) break;
                cout << "\nBitte die dementsprechende Zahl eingeben!!!\n" << endl;
                };
    

    hier probiere ich mit einer endlosschleife eine erneute eingabe zu erzwingen falls der user eine Zeichenkette statt einer Zahl eingibt... nur leider mag mein Computer schon den Fakt das in eine int eine Zeichenkette gespeichert wird nicht und spielt verrückt....

    Gibt es noch eine dritte möglichkeit einen solchen Anwendungsfehler aufzufangen oder muss man bei der eingabe einfach aufpassen?

    PS: ich habe auchschon überlegt in einen string zu speichern, allerdings mag weder isalpha() noch switch() einen string 😞



  • Lies doch direkt in den int ein...





  • schonmal ausprobiert was passiert wenn man mal eben so eine zeichenkette in einem int speichern will..... (tippfehler oder so?) dann kannst du das Fenster schliessen und Programm neustarten... und genau das will ich verhindern



  • Gar nix passiert da... cin schaltet auf fehlermodus und stellt sich quer.

    Versuchs mal damit:

    while ( !std::cin.good() )
    {
        std::cout<<"\nGeben sie eine Ganzzahl ein: ";
        std::cin.clear(); // cin wieder von fehlermodus auf normal schalten
        std::cin.ignore(std::cin.rdbuf->in_avail()); // alle zeichen verwerfen die noch im puffer sind
        std::cin>>zwei; // deinen int einlesen
    }
    


  • @Dr. std::cin.ignore(std::cin.rdbuf->in_avail()) <- invalide use of member base operand of '->'is not a pointer 😕

    was heisst das?? Sonst hört sich dein Vorschlag sehr interressant an....



  • Jud4s schrieb:

    @Dr. std::cin.ignore(std::cin.rdbuf->in_avail()) <- invalide use of member base operand of '->'is not a pointer 😕

    Schau mal in der Referenz deiner Wahl, da fehlt lediglich ein Klammernpaar:

    std::cin.ignore( std::cin.rdbuf()->in_avail() );
    


  • int action = 0;
                do 
                {
                cout<<"\nGeben sie die entsprechende Zahl ein: ";
                cin.clear(); // cin wieder von fehlermodus auf normal schalten
                cin.ignore(std::cin.rdbuf()->in_avail()); // alle zeichen verwerfen die noch im puffer sind
                cin>>action; // deinen int einlesen 
                }while ( !std::cin.good() );
    

    cin stellt sich immernoch quer... sprich die schleife funkst net 😞

    und wenn ich das erste einlesen vor der schleife machen klappt es auchnicht 😞 aber die idee hörte sich gut an... mach ich da was falsch oder klappt die idee nicht....



  • Die Variante mit in_avail funktioniert immernoch nicht zuverlässig. Steht die etwa immernoch in der FAQ?

    Ersetze die Zeile durch

    cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    

    Du brauchst dann noch den Header <limits>.


  • Administrator

    LordJaxom schrieb:

    Die Variante mit in_avail funktioniert immernoch nicht zuverlässig. Steht die etwa immernoch in der FAQ?

    Ersetze die Zeile durch

    cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    

    Ehm, müsste eigentlich da nicht nur ein sync aufruf reichen?

    std::cin.sync();
    

    Also bei mir reicht das immer und sync ist auch genau so definiert, zumindest für std::cin. Oder habe ich was verpasst?

    Grüssli



  • thx... nun funktioniert es... danke


Log in to reply