Bei 'cin' ein Default Wert vorschlagen



  • bwbg schrieb:

    Mein Ansatz(ausbaufähig):...

    Ohne Dir zu nahe treten zu wollen: Was bringt dieser Aufwand?

    Gruß,

    Simon2.



  • _matze schrieb:

    bwbg schrieb:

    /* Ein Kommentar schadet nicht */
    

    Großartig! 😃

    Doch, sie vergrößern die CPP-Datei unnötig! 😃



  • harrahrr schrieb:

    Doch, sie vergrößern die CPP-Datei unnötig! 😃

    Genau wie Leerzeichen, Zeilenumbrüche und der ganze Quatsch! 😃 Ein richtig schönes Programm steht in einer Zeile! 😉



  • bwbg schrieb:

    std::string temp;
            std::getline(is, temp);
            if(temp == "" && default_value != "") return default_value;
            return temp;
    

    die zeile mit dem if verstehe ich nicht.



  • Simon2 schrieb:

    [...]
    Ohne Dir zu nahe treten zu wollen: Was bringt dieser Aufwand?
    [...]

    Meine Füße sind zum Glück nicht so groß...

    Ein konsistentes Verhalten bei Eingabeaufforderungen. Richtig ist, dass es bei einer einzigen Abfrage *keinen* Mehrwert bietet. Sobald diese Zahl jedoch steigt, wirds wieder händisch.

    Grüße... Heiko



  • volkard schrieb:

    bwbg schrieb:

    std::string temp;
            std::getline(is, temp);
            if(temp == "" && default_value != "") return default_value;
            return temp;
    

    die zeile mit dem if verstehe ich nicht.

    Sie ist auch zum Teil überflüssig. Ich sollte meine postings-before-caffeine-policy überarbeiten.

    if(temp == "") return default_value;
    

    reicht hier vollkommen aus.

    Ich hoffe mal, dass ich deinen wink mit dem Scheunentor richtig verstanden habe, Volkard.

    Grüße... Heiko



  • jetzt verstehe ich sie. da steht: wenn der benutzer nix eingegeben hat, wird der default-wert genommen.

    dein programm macht also sowas

    int main() 
        { 
            int ergebnis=44100; 
            cout<<"Bitrate fuer die Aufnahme [44100]: "; 
            cin>>ergebnis;
            std::cout << "Sie waehlten:" << ergebnis << '\n'; 
        }
    

    oder sowas

    int main() 
        { 
            string name; 
            cout<<"Name fuer die Aufnahme [Hans]: "; 
            cin>>name;
            if(name=="") 
                    name="Hans";
            std::cout << "Sie waehlten:" << name << '\n'; 
        }
    

    mhmm.ich weiß ja nicht, ob ich mich mit dem vielen code so anfreunden kann.
    wäre sicherlich anders, wenn ich noch einen mindes- und maximalwert angeben könnte und eine eingabeaufforderung meiner wahl und einen zünftigen benutzerbeschimpfungestext, der kommt, wenn der benutzer nicht im erlaubten bereich war.



  • bwbg schrieb:

    ...

    😕
    Zwar toll gemacht, aber Sinn ...

    _matze schrieb:

    Ganz übel dahingeschludert: 😉

    int main(){}
    

    Stimmt, denn es ist ein Fehler in deinem Code. Drückt man einen Buchstaben oder eine Zahl, wird diese/r "geschrieben" und man kann ihn/sie nicht mehr löschen.

    volkard schrieb:

    ...

    Ich muss mich volkard anschließen. Für diese kleine Funktionalität, ist es echt ein wenig unnötig und vorallem, ein riesen Umweg.



  • FreakY<3Cpp schrieb:

    Stimmt, denn es ist ein Fehler in deinem Code. Drückt man einen Buchstaben oder eine Zahl, wird diese/r "geschrieben" und man kann ihn/sie nicht mehr löschen.

    Ja, und nicht nur das: der schlimme Fehler ist ja einfach, dass das erste eingegebene Zeichen nicht zum verarbeiteten Input gehört. Bei Eingabe 23 kommt also 3 an... Es war ja noch so früh... 🤡

    Wenigstens habe ich als einziger versucht, die ursprüngliche Intention zu verfolgen (so wie ich sie verstanden habe), nämlich den Default-Wert zu drucken und bei eventueller Eingabe zu löschen, um die Eingabe dort zu platzieren. Na ja, muss man auch nicht haben... 😉



  • _matze schrieb:

    int main(){
    	int defaultLength=50;
    	int length_t;
    	cout << "Max. Länge des Tunnels (in Meter): " << defaultLength;
    	char c=getch();
    	if(c==13) {
    		length_t=defaultLength;
    	}else {
    		cout << "\b\b" << "  " << "\b\b" << c;
    		cin >> length_t;
    	}
    	cout << "\nLänge: " << length_t;
    	getchar();
    }
    

    War ja schon eig. ein guter Ansatz. Mach noch aus der Zeile

    cout << "\b\b" << "  " << "\b\b" << c;
    

    folgenedes:

    cout << "\b\b" << "  " << "\b\b";
    

    Dann wirkt das Programm schonmal besser. Aber ganz so wie du dir das vorstellst Peter01, wird das glaube ich nicht gehen. Höchstens wenn du nur mit getch() arbeitest. Ich würde mir das so vorstellen, dass du den Text schreibst, wird BACKSPACE gedrückt, gehst du an die Konsolenkoordinaten-XY, wird eine Tastegedrückt, schreibst du sie usw. Ob sich der Aufwand lohnt, ist die andere Frage.



  • [quote="FreakY<3Cpp"]

    cout << "\b\b" << "  " << "\b\b";
    

    Ja, nur dass man dann das erste Zeichen immer zwei mal eingeben muss. Die sinnvollste Lösung wäre wohl zeichenweise mit getch einlesen, String zusammenbasteln und dann konvertieren.

    Allerdings...

    FreakY<3Cpp schrieb:

    Ob sich der Aufwand lohnt, ist die andere Frage.

    Das ist der Punkt.



  • std::istream hat das geniale putback, womit es so aussähe:

    ...
        char c=getch();
        if(c==13) {
            length_t=defaultLength;
        }else {
            cin.putback( c ); // <-
            cin >> length_t;
        }
        ...
    

    (Abgesehen davon, dass diese Lösung sowieso nicht mehr erwünscht ist 😃 Wollte nur mal auf "putback" hinweisen :))



  • Oh, putback ist cool, kannte ich noch nicht.

    Gut, dann hier die hässliche, viel zu aufwendige und nicht mehr erwünschte Lösung: 😉

    int main(){ 
    	int defaultLength=50; 
    	int length_t; 
    	char sDefault[64];
    	sprintf(sDefault,"%d",defaultLength);
    	cout << "Max. Länge des Tunnels (in Meter): " << defaultLength; 
    	char c=getch(); 
    	if(c==13) { 
    		length_t=defaultLength;
    	}else { 
    		for(int i=0;i<strlen(sDefault);i++) cout << "\b";
    		for(int i=0;i<strlen(sDefault);i++) cout << " ";
    		for(int i=0;i<strlen(sDefault);i++) cout << "\b";
    		cout << c;
    		cin.putback(c);
    		cin >> length_t; 
    	} 
    	cout << "\nLänge: " << length_t; 
    	getchar();
    }
    


  • Öhm ... entweder liegts an mir, oder das Programm lässt mich einfach nix eingegeben, außer ein Buchstaben der geschrieben wird und es gibt Länge : 2293624 aus.



  • FreakY<3Cpp schrieb:

    Öhm ... entweder liegts an mir, oder das Programm lässt mich einfach nix eingegeben, außer ein Buchstaben der geschrieben wird und es gibt Länge : 2293624 aus.

    Meinst du meins? Ja, dann liegts an dir! 😉 Bei mir lüppt jedenfalls alles.



  • _matze schrieb:

    FreakY<3Cpp schrieb:

    Öhm ... entweder liegts an mir, oder das Programm lässt mich einfach nix eingegeben, außer ein Buchstaben der geschrieben wird und es gibt Länge : 2293624 aus.

    Meinst du meins? Ja, dann liegts an dir! 😉 Bei mir lüppt jedenfalls alles.

    Bist du dir sicher 😉 Sobald ich BackSpace oder sonst irgendeine andere Taste drücke, lässt das Programm mich nichts mehr machen und gibt aus "Länge : 2293624", egal was ich mache, außer wenn ich Enter drücke, dann steht dort 50.



  • Na, wenn du eine Zahl oder Enter drückst, dann klappts. Und bei einer Zahl wird der bisherige Standardwert gelöscht und der Cursor an diese Stelle gesetzt. Darum ging es ja. Alle möglichen Fehleingaben seitens des Users habe ich jetzt nicht abgefangen. 😉



  • Hallo

    Also schön, dass auf mein Problem so viele Ideen zusammen gekommen sind 🙂
    Wobei der Effekt der Beispiele war nicht ganz was ich mir vorgestellt habe.

    Ich wollte ja eigentlich, dass der Defaultwert von Benutzer änderbar im Sinne von editierbar ist. Eigentlich hoffte ich, dass der cin Befehl noch irgendein Parameter kennt, der einen Vorgabewert zulässt. Immerhin wäre im cin schon ein kompletter Editor eingebaut. (Backspace zum zurückgehen, Delete zum einzelne Zeichen löschen, Zeichen anfügen etc.) Sowas scheint's aber nicht zu geben.

    Meine andere Idee wäre spontan gewesen, den Vorgabewert irgendwie als Benutzereingabe zu simulieren, also irgendwie in den Keyboardbuffer zu bringen. Wüsste aber nicht wie das nach dem Befehl cin gehen sollte.

    So wie's ausschaut, müsste man sich einen kleinen Editor schreiben, ähnlich wie _matzes Beispiele. Weiss aber nicht, ob sich das lohnt.

    Hier aber noch mal ein anderes praktisches Beispiel:

    IP Adresse des Zielcomputers: 192.168.0.120
    

    Oft müsste man hier nur ein oder 2 Ziffern ändern und als fauler Mensch möchte ich nicht immer die volle IP eingeben. 😉

    Danke auf jeden Fall mal für das bisherige Feedback. 👍


Anmelden zum Antworten