Bei 'cin' ein Default Wert vorschlagen



  • Hallo

    Ich suche eine Möglichkeit bei folgender Abfrage einen Defaultwert vorzugeben, den der User entweder ändern oder mit Enter bestätigen kann.

    cout << "Max. Länge des Tunnels (in Meter): ";
    cin >> length_t;
    
    Max. Länge des Tunnels (in Meter): 100
    

    Habe dazu leider nichts gefunden.

    Gruss, Peter



  • Ganz übel dahingeschludert: 😉

    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();
    }
    

    Wenn du noch die Anzahl der Zeichen des Default-Werts nimmst und abhängig davon Backspaces und Leerzeichen ausgibst, dann passt es vielleicht schon ganz gut. Vielleicht gibts auch ne bessere Lösung, keine Ahnung...



  • hmmm mein Ansatz wäre:

    EDIT: OK, wenn der DefWert schon vorab ausgegeben werden soll...

    int length_t;
       cout << "Max. Länge des Tunnels (in Meter, \'.\' für default 50): ";
       if(!cin >> length_t) length_t = 50;
    

    Gruß,

    Simon2.



  • Die Vorgabe war ja, dass der Default-Wert direkt ausgegeben wird, aber ansonsten ist deine Lösung ein wenig kompakter. 😉



  • Mein Ansatz(ausbaufähig):

    #include <iostream>
    #include <string>
    
    std::string input(
            std::string const& prompt,
            std::string const& default_value=std::string(),
            std::ostream& os=std::cout,
            std::istream& is=std::cin);
    
    int main()
        {
            std::string ergebnis;
            ergebnis = input("Bitrate fuer die Aufnahme", "44100");
            std::cout << "Sie waehlten:" << ergebnis << std::endl;
        }
    
    std::string input(
            std::string const& prompt,
            std::string const& default_value,
            std::ostream& os,
            std::istream& is)
        /* Ein Kommentar schadet nicht */
        {
            if(default_value != "") {
                os << prompt << " [" << default_value << "]: " << std::flush;
            } else {
                os << prompt << ": " << std::flush;
            }
    
            std::string temp;
            std::getline(is, temp);
            if(temp == "" && default_value != "") return default_value;
            return temp;
        }
    


  • bwbg schrieb:

    /* Ein Kommentar schadet nicht */
    

    Großartig! 😃



  • 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.


Anmelden zum Antworten