(gelöst) Benutzereingabe "1" OK "1 a" nichtOK!



  • Nathan schrieb:

    Wo ist das Problem, wenn "1 a" nicht als 1 akzeptiert wird? Es ist doch eine gültige 1!?
    So etwas zu realisieren ist übrigens schwieriger und aufgrund deines Mixes aus std::cin, printf, fflush(stdin)* und der Variablendeklaration ganz am Anfang der Funktion vermutlich zu hoch für dich.

    *Undefined Behavior. Dein Programm könnte auch "2" und "Hallo Welt!" als 1 akzeptieren. Oder deine Festplatte formatieren.

    variablen am anfang der funktion sind doch normal?
    außer man hat tausende zeilen code aber ansonsten ist das meines wissens nach vollständig ok...
    so extrem lokal muss ja auch nich sein... das ist ja dann ab einem bestimmten punkt auch unübersichtlich und schlecht nachvollziehbar/ wartbar...

    also außer in manchen fällen wo es wirklich sinn macht, immer die variablen an den anfang der funktion!
    oder liege ich damit vollständig falsch?

    soweit ich weiß macht das auch keinen großen performance unterschied... außer vll in manchen spezialfäll (um die geht es mir abe rnicht) ...

    ist aber einfach besser anchvollziehbar und übersichtlicher -> was ja schon ein enormer vorteil wäre... 🙄 oder?



  • MfG schrieb:

    @ swordfish warum machst du das so kompliziert?

    Weiß nicht? Ist das kompliziert? Vielleich deshalb, weil sich dein Code so wie er dasteht nichtmal kompilieren lässt? Und selbst, wenn man deine Logikfehler ausbügelt:

    #include <iostream>
    #include <string>
    #include <cstring>
    
    int main()
    {
    	bool status=false;
    	std::string eingabe;
    
    	while(status==false)
    	{
    		std::cin >> eingabe;
    
    		if(std::strcmp(eingabe.c_str(), "1")==0)
    		{
    			std::cout << "Hier wäre es jetzt 1-1" << std::endl;
    			status=true;
    		}
    	}
    }
    

    geht "1 a" immer noch als gültige 1 durch.



  • Swordfish schrieb:

    MfG schrieb:

    @ swordfish warum machst du das so kompliziert?

    Weiß nicht? Ist das kompliziert? Vielleich deshalb, weil sich dein Code so wie er dasteht nichtmal kompilieren lässt? Und selbst, wenn man deine Logikfehler ausbügelt:

    #include <iostream>
    #include <string>
    #include <cstring>
    
    int main()
    {
    	bool status=false;
    	std::string eingabe;
     
    	while(status==false)
    	{
    		std::cin >> eingabe;
     
    		if(std::strcmp(eingabe.c_str(), "1")==0)
    		{
    			std::cout << "Hier wäre es jetzt 1-1" << std::endl;
    			status=true;
    		}
    	}
    }
    

    geht "1 a" immer noch als gültige 1 durch.

    sry war nur pseudo code hab gerade keine ide zur verfügung...
    hab ich nur halb herzig eben zur verdeutlich gecoded...

    strcmp ist kein mitglied von std 😉 ... also der code den du "verbessert" hast ist auch so nicht compilierbar...

    und mein beispiel funktioniert... da das was du feststellst an "cin" liegt... da "cin" die "eingabe" nach einem leerzeichen beendet...
    deswegen geht auch "1 a" durch da cin eh nur die 1 ein ließt 😉 ...

    siehe hier :

    #include <iostream>
    #include <string>
    #include <cstring>
    
    int main()
    {
        bool status=false;
        std::string eingabe;
    
        while(status==false)
        {
            std::cin >> eingabe;
    
            if(strcmp(eingabe.c_str(), "1")==0)
            {
                std::cout << "Hier wäre es jetzt 1-1" << std::endl;
                std::cout << eingabe.c_str();
                status=true;
            }else{
            	std::cout << "Bitte eine 1 eingeben!" << std::endl;
            }
        }
    }
    

    also es funktioniert schon... ! 😉
    falls man das umgehen will einfach cin durch getline austauschen 😉 ...
    ist jetzt auch genau so compilierbar und ausführbar... (c++11)

    ich fand schon das es relativ kompiliziert aussieht, du nicht?
    kann mich auch täuschen... deswegen frage ich ja mal... 🙄



  • um es nochmal zuverdeutlichen...:

    "cin" ließt bei einer eingabe von "1 a" nur die 1 in den string...
    da die eingabe nach einem leerzeichen von cin beendet wird...

    deswegen ist der vergleich auch richtig 😉 ... also vollständig korrekt...
    wenn man das umgehen will -> cin durch getline ersetzen...!



  • MfG schrieb:

    variablen am anfang der funktion sind doch normal?

    Ja, aber nur in C (weil man das dort so machen muss). In C++ definiert man alles so spät / lokal wie möglich.

    MfG schrieb:

    außer man hat tausende zeilen code aber ansonsten ist das meines wissens nach vollständig ok...

    Wer tausende Zeilen Code in einer einzigen Funktion hat sollte sich erstmal ganz andere Gedanken machen...

    MfG schrieb:

    so extrem lokal muss ja auch nich sein... das ist ja dann ab einem bestimmten punkt auch unübersichtlich und schlecht nachvollziehbar/ wartbar...

    Doch und ne. Aber alles am Anfang zu machen, das ist unübersichtlich und schlecht nachvollziehbar / wartbar.

    MfG schrieb:

    also außer in manchen fällen wo es wirklich sinn macht, immer die variablen an den anfang der funktion!

    Und was sind deiner Meinung nach diese Sonderfälle, bei welchen es Sinn macht?

    MfG schrieb:

    soweit ich weiß macht das auch keinen großen performance unterschied... außer vll in manchen spezialfäll (um die geht es mir abe rnicht) ...

    Oh nein, nicht schon wieder dieses Getrolle. Hab langsam die Nase voll von dieser Geschichte mit der Performance im Bezug auf die Reihenfolge der Variablendefinitionen. (siehe auch hier, scheint ein Running Gag zu sein...)

    MfG schrieb:

    sry war nur pseudo code hab gerade keine ide zur verfügung...

    Inwiefern hängt das zusammen?

    MfG schrieb:

    strcmp ist kein mitglied von std 😉 ... also der code den du "verbessert" hast ist auch so nicht compilierbar...

    Doch und doch. Alle C-Funktionen sind in der C++-Variante (aus den C++-Headern mit dem c-Präfix) im Namensbereich std . Siehe auch hier: http://en.cppreference.com/w/cpp/string/byte/strcmp



  • asfdlol schrieb:

    MfG schrieb:

    variablen am anfang der funktion sind doch normal?

    Ja, aber nur in C (weil man das dort so machen muss). In C++ definiert man alles so spät / lokal wie möglich.

    MfG schrieb:

    außer man hat tausende zeilen code aber ansonsten ist das meines wissens nach vollständig ok...

    Wer tausende Zeilen Code in einer einzigen Funktion hat sollte sich erstmal ganz andere Gedanken machen...

    MfG schrieb:

    so extrem lokal muss ja auch nich sein... das ist ja dann ab einem bestimmten punkt auch unübersichtlich und schlecht nachvollziehbar/ wartbar...

    Doch und ne. Aber alles am Anfang zu machen, das ist unübersichtlich und schlecht nachvollziehbar / wartbar.

    MfG schrieb:

    also außer in manchen fällen wo es wirklich sinn macht, immer die variablen an den anfang der funktion!

    Und was sind deiner Meinung nach diese Sonderfälle, bei welchen es Sinn macht?

    MfG schrieb:

    soweit ich weiß macht das auch keinen großen performance unterschied... außer vll in manchen spezialfäll (um die geht es mir abe rnicht) ...

    Oh nein, nicht schon wieder dieses Getrolle. Hab langsam die Nase voll von dieser Geschichte mit der Performance im Bezug auf die Reihenfolge der Variablendefinitionen. (siehe auch hier, scheint ein Running Gag zu sein...)

    MfG schrieb:

    sry war nur pseudo code hab gerade keine ide zur verfügung...

    Inwiefern hängt das zusammen?

    MfG schrieb:

    strcmp ist kein mitglied von std 😉 ... also der code den du "verbessert" hast ist auch so nicht compilierbar...

    Doch und doch. Alle C-Funktionen sind in der C++-Variante (aus den C++-Headern mit dem c-Präfix) im Namensbereich std . Siehe auch hier: http://en.cppreference.com/w/cpp/string/byte/strcmp

    ja das ist klar so spät wie möglich... doch hier macht es für mich nur sinn funktionsgebundene variablen lokal zu definieren... ich muss nicht meine variablen so deklarieren if(int x;x<100;x++)
    das führt in meinen augen bei großen projekten zu unübersichtlichkeit... aber ist wahrscheinlich geschmackssache... oder macht soetwas deutliche performance unterschiede?
    -> variablen also "Fast" so lokal wie möglich um einen ausgleich zwischen leserlichkeit und effektivität zuerhalten...

    ich meinte nich in der funktion sondern tausende zeilen code im ganzen projekt...

    ich deklariere dort meine variablen wo ich diese benötige (funktionsweise) aber ich fange nicht mit soertwas an weil das in meinen augen nix bring:
    if(int x;x<100;x++)
    vll macht soetwas in spezial fällen sinn aber bei 100 zeilen projektcode macht das das ganze einfach unübersichtlich für mich... ode rhat das performance vorteile die man nutzen sollte? wenn ja warum performance oder andere vorteile? (Quelle?)

    embedded-programmierung z.b. dort macht das sinn 😉 ... bzw. von dort kenn ich solchen c++ code... 🙄

    in dem thread steht aber das es keinne unterschied mach? also genau das was ich gesagt habe? -> ich trolle nicht... ich hab dem thread ersteller die frage beantwortet... falls ich doch i.wen beleidigt oder angegriffen habe war nicht meine absicht keines falls...

    hängt nicht zusammen wollte es nur mal sagen weil es ja hieß das der code nicht compiliert... hab ich gesagt das das zusammenhängt? 🙄

    @ fragesteller
    nochmal zur eigentlichen frage:
    hiermit kommt nur die eingabe von 1 2 3 oder 4 durch...

    #include <iostream>
    #include <string>
    #include <cstring>
    
    int main()
    {
        bool status=false;
        std::string eingabe;
    
        while(status==false)
        {
        	std::cout << "Bitte eine 1,2,3 oder 4 eingeben: "<< std::endl;
    
            getline(std::cin,eingabe);
    
            if(strcmp(eingabe.c_str(), "1")==0)
            {
                std::cout <<"Eingabe: " << eingabe.c_str() <<" --Erfolg, eine 1 eingeben!" << std::endl;
                status=true;
            }
    
            if(strcmp(eingabe.c_str(), "2")==0)
            {
                std::cout <<"Eingabe: " << eingabe.c_str() <<" --Erfolg, eine 2 eingeben!" << std::endl;
                status=true;
            }
    
            if(strcmp(eingabe.c_str(), "3")==0)
            {
                std::cout <<"Eingabe: " << eingabe.c_str() <<" --Erfolg, eine 3 eingeben!" << std::endl;
                status=true;
            }
    
            if(strcmp(eingabe.c_str(), "4")==0)
            {
                std::cout <<"Eingabe: " << eingabe.c_str() <<" --Erfolg, eine 4 eingeben!" << std::endl;
                status=true;
            }
    
            if(status==false)
            {
            	std::cout <<"Eingabe: " << eingabe.c_str() <<" --Fehler, Bitte eine 1,2,3,4 eingeben!" << std::endl;
            }
        }
    }
    


  • Bedenke, dass du nur eine while-Schleife benutzen kannst. Eine for-Schleife würde hier nicht funktionieren!



  • MarkusMundM schrieb:

    Bedenke, dass du nur eine while-Schleife benutzen kannst. Eine for-Schleife würde hier nicht funktionieren!

    Doch, klar. while(foo) kann man immer auch for(;foo;) schreiben. Es ändert sich gar nichts.



  • MfG schrieb:

    "cin" ließt bei einer eingabe von "1 a" nur die 1 in den string...
    da die eingabe nach einem leerzeichen von cin beendet wird...

    Ja. Und wenn du nochmal beim OP nachschaust, dann wirst du merken, daß dieses Verhalten eben nicht gewünscht ist.



  • Swordfish schrieb:

    MfG schrieb:

    "cin" ließt bei einer eingabe von "1 a" nur die 1 in den string...
    da die eingabe nach einem leerzeichen von cin beendet wird...

    Ja. Und wenn du nochmal beim OP nachschaust, dann wirst du merken, daß dieses Verhalten eben nicht gewünscht ist.

    und wenn du mal mein text ordentlich ließt wirst du sehen das mein zu letzt gepostet beispiel sich NICHT so verhält...
    da ich getline nutze ... 🙄

    lg



  • nachtrag:

    dieses verhalten entsteht dadurch das std::cin die eingabe nach einem leerzeichen nicht mehr "ließt/erkennt"...
    deswegen ist "1 a" auch -> 1
    wenn du "1a" bei std::cin eingibst dann klappt das auch mit cin...! 😉

    bei getline() ist dies nicht der fall deswegen tritt dort das verhalten nicht auf... 😉

    lg



  • oenone schrieb:

    MarkusMundM schrieb:

    Bedenke, dass du nur eine while-Schleife benutzen kannst. Eine for-Schleife würde hier nicht funktionieren!

    Doch, klar. while(foo) kann man immer auch for(;foo;) schreiben. Es ändert sich gar nichts.

    Nein, da MfG eine bool Variable verwendet.
    for(;bChoiceState == false;) !! 👎



  • Ich halte Zeilenweise in einen String lesen und dann auseinanderfriemeln trotzdem für eine bescheidene Lösung. Was machst denn, wenn der integer mehrstellig wird? Viel Spaß!

    @ MarkusMundM: Hunger? Fang: <°)(((><



  • Was rede ich denn. Doch das geht natürlich. Sorry, ich war doof!



  • Swordfish schrieb:

    Ich halte Zeilenweise in einen String lesen und dann auseinanderfriemeln trotzdem für eine bescheidene Lösung. Was machst denn, wenn der integer mehrstellig wird? Viel Spaß!

    @ MarkusMundM: Hunger? Fang: <°)(((><

    ich habe keinen intger im code... 😕
    sondern ein string und ein stringcompare...
    da ist egal was drinn steht...
    entweder es ist identisch == 0 oder es ist das nicht...
    also was für ein intger meinst du? 🙄

    zu mal das auch nicht die frage vom threadersteller war... 😃
    na ja egal ... ich muss mich hier nicht verteidigen... verstehe eig gar nicht was du meinen code andauernd in fragestellst aber noch nicht mal richtig liest?!



  • ps. auch das zeilenweise einlesen ist in diesem fall ok...
    denn ich "firemel" dort nix auseinander...
    bitte schau ich nutze strcmp... das ist ein vergleich...!!
    (kein RegEx oder soetwas... bitte nicht verwechseln... )



  • MfG schrieb:

    ich muss mich hier nicht verteidigen... verstehe eig gar nicht was du meinen code andauernd in fragestellst aber noch nicht mal richtig liest?!

    Obwohl ich immer noch denke, dass du bloss trollst und dich dumm stellst:
    Mehrere Leute haben dich auf elementare Fehler / Unschönheiten im Code aufmerksam gemacht, was du getrost ignoriert hast und für mich liest er sich so, als wäre er von einem blutigen Anfänger geschrieben worden ( strcmp(eingabe.c_str(), [...] , std::cout << [...] eingabe.c_str() [...] oder dass du vier Mal denselben Code im Programm hast und nicht auf die Idee kommst, eine Funktion oder eine Schleife daraus zu machen (von den Logikfehlern mal abgesehen)). Ein gutes Grundlagenbuch zu besorgen und es durchzuarbeiten würde bestimmt nicht schaden.

    Und auch für dich gibt's etwas Leckeres: ><(((°>



  • asfdlol schrieb:

    MfG schrieb:

    ich muss mich hier nicht verteidigen... verstehe eig gar nicht was du meinen code andauernd in fragestellst aber noch nicht mal richtig liest?!

    Obwohl ich immer noch denke, dass du bloss trollst und dich dumm stellst:
    Mehrere Leute haben dich auf elementare Fehler / Unschönheiten im Code aufmerksam gemacht, was du getrost ignoriert hast und für mich liest er sich so, als wäre er von einem blutigen Anfänger geschrieben worden ( strcmp(eingabe.c_str(), [...] , std::cout << [...] eingabe.c_str() [...] oder dass du vier Mal denselben Code im Programm hast und nicht auf die Idee kommst, eine Funktion oder eine Schleife daraus zu machen (von den Logikfehlern mal abgesehen)). Ein gutes Grundlagenbuch zu besorgen und es durchzuarbeiten würde bestimmt nicht schaden.

    Und auch für dich gibt's etwas Leckeres: ><(((°>

    ? ich nutze gar keinen intger in dem code... deswegen kann da auch nix 2 stellig werden...
    weiter fehler waren? ich kann mich eig an nix erinnern?
    -> Marcus das ich aus while keine for schleife machen kann...
    dafrage ich mich erstmal... die aufgabe war 1,2,3 und 4 einizig als eingabe zuzulassen... das tut mein code...
    weiß nicht wenn man die konkrekte aufgabenstellung mit einbezieht... wo wären dann noch verbesserungen? das würde mich jtzt mal interessieren ... denn diese unschönheiten existieren ja gar nicht in meinem zu letzt geposteten beispiel...

    wo sind denn in meinem code elementare fehler? (bis auf das argument mit der funktion... )

    🙄 ok mit der funktion hast du recht... hab ich auch schon bereut... aber das hat ja noch nichmal einer gesagt...
    (aber i.was von intger obwohl ich nict mal eine im code hab? -> aber wahrscheinlich ein schönheitsfehler... 😃 )

    lol ein einfacher code heißt nicht das ich ein anfänger bin...
    aber eig sollte es doch das ziel sein ein komplexes problem so einfach wie möglich zu lösen oder siehst du das anders?
    und es geht auch nicht immer um performance und wer hat die komplizierteste funktion benutzt... mein code ist übersichtlich und leserlich... wartbar auch in 30 jahre... weil du in 1 blick siehst was dort passiert... (also ich zumindest)

    und wo sollte ich denn da eine schleife nutzen? ich hab doch eine...? 😕

    und was für logikfehler...?

    ich lerne auch immer was dazu... aber außer das man noch eine funktion draus machen kann, was ich nicht gemacht habe aus zeitgründen...
    außerdem hab ich ja auch nie behauptet der code ist perfekt... 😉

    aber "logikfehler" und "elementare fehler" in meinem zuletzt geposten code würden mich wirklich mal interessieren...? 😕



  • hier übrigens auch was für dich 😉 ...

    <(((°> && ><(((°>



  • sry edit geht nicht...

    aber ich trolle auch nicht! ich wollte nur helfen...
    und ganz ehrlich ärgere ich mich schon darüber...

    hätte er halt das "eierlegendewollmilchmonster" von Swordfish genommen...
    mir ist das egal...

    aber ich hab nicht gerne unnötigen code der das ganze auch noch in meinen augen im nachhinein (nach 1-10 jahren) nicht mehr nachvollziehbar macht ode rnur mit soviel aufwand das du es neu coden kannst... 😉

    der code muss nicht "immer" in jeder "lage" auch in welchen in die er evt. nie kommt funktionieren...
    sondern nur alles was realistisch passieren kann behandeln und sie niemals undefiniert verhalten 😉 ...

    warum einfach wenns auch kompiliziert geht ... oder? 🙄


Anmelden zum Antworten