C++ (Konsole) eine mehrstellige Zahl löschen



  • _matze schrieb:

    Dann gib doch nicht "7", sondern "7 " aus.

    Ich gebe ja keine Zahl an sich aus, sondern eine Variable an sich (zum Beispiel i)

    Je nachdem, wie dein Bildschirm aussieht und wie oft du ihn aktualisieren willst, könntest du ihn ja auch komplett löschen und neu beschreiben.

    Aber, wenn ich z.b. einen einfachen Countdown, der zwischen Text steht haben will, dann kann ich ja schlecht komplett löschen.



  • oder schreib " 7" also fest Anzahl an Stellen mit führenden Leerzeichen. (z.B. bei printf %5d)
    Dann hast du auch immer die selbe Anzahl an \b.



  • ja, nur dass wir hier C++ machen und kein C.

    in C++ geht das mit setwidth und precision und so weiter. das kannst du dir so einstellen, dass deine zahlen immer in der gleichen länge ausgegeben werden. und das kannst du danach wieder überschreiben



  • Skym0sh0 schrieb:

    ja, nur dass wir hier C++ machen und kein C.

    Deswegen war das auch in Klammern.
    Es geht aber um das Prinzip.



  • ja, ok das stimmt natürlich. Da gebührt dir die Ehre



  • Danke DirkB, Skym0sh0 und _matze für eure Antworten, jedoch möchte ich keine Zahl an sich(cout << "7 ";), sondern eine Variable ausgeben(cout << i;).



  • HalloLeute schrieb:

    Danke DirkB, Skym0sh0 und _matze für eure Antworten, jedoch möchte ich keine Zahl an sich(cout << "7 ";), sondern eine Variable ausgeben(cout << i;).

    Die 😉 waren keine absicht!!!



  • ja. davon sind wir dran...

    edit programmbeispiel:

    schau dir das einfach mal an, denn genau das meinen wir alle

    #include <iostream>
    using std::cout;
    using std::endl;
    
    int main()
    {
    	int i = 385;
    
    	cout << "\"";
    
    	cout.width(10);
    	cout << i;
    
    	cout << "\"";
    	cout << endl;
    
    	std::cin.get();
    	return 0x0;
    }
    


  • Skym0sh0 schrieb:

    ja. davon sind wir dran...

    Was meinst du damit?



  • Das ist uns auch klar.
    Das kannst du auch machen.
    Das mit dem "7 " bzw. " 7" waren ja auch nur Beispiel wo das Leerzeichen hin soll.

    http://www.c-plusplus.net/forum/310817?highlight=setw



  • DirkB schrieb:

    Das ist uns auch klar.
    Das kannst du auch machen.
    Das mit dem "7 " bzw. " 7" waren ja auch nur Beispiel wo das Leerzeichen hin soll.

    http://www.c-plusplus.net/forum/310817?highlight=setw

    Aber dann passt es doch trotzdem nicht, wenn ich eine 1-stellige Zahl auf eine 2-stellige ausgeben will, oder habe ich da was falsch verstanden?



  • Du sollst mit dem Modifier die Variable immer mit einer festen Breite ausgeben.
    Bei der Ausgabe werden bei Bedarf Leerzeichen eingefügt.
    Dann hast du die Einerstelle immer am gleichen Ort.



  • DirkB schrieb:

    Du sollst mit dem Modifier die Variable immer mit einer festen Breite ausgeben.
    Bei der Ausgabe werden bei Bedarf Leerzeichen eingefügt.
    Dann hast du die Einerstelle immer am gleichen Ort.

    Ja, genau das hab ich auch, aber das klappt nicht:

    Sagen wir mal eine feste Breite von 4 Stellen.

    Bei der Zahl 10 wäre das: cout << "  10";
    Bei der Zahl 7 wäre das:  cout << "   7";
    

    Wenn ich 10 mit 7 überschreiben will, wird die 7 an die 4 Stelle gesetzt und überschreibt die 0. Die 1 an der 3-ten Stelle von 10 bleibt jedoch.

    So ergibt es: cout << "  17";
    


  • Ausprobieren, begreifen, umbauen, einbauen: 😉

    #include <iostream> 
    #include <time.h>
    
    using std::cout; 
    using std::endl; 
    
    void sleep( clock_t wait )
    {
    	clock_t goal;
    	goal = wait + clock();
    	while( goal > clock() )
    		;
    }
    
    int main() 
    { 
    	int i = 1100; 
    
    	while(i) {
    		cout.width(10);
    		cout << i--;
    		for(int j=0;j<10;++j) cout << '\b';
    		sleep(10);
    	}
    
    	cout << endl; 
    
    	std::cin.get(); 
    	return 0x0; 
    }
    


  • _matze schrieb:

    Ausprobieren, begreifen, umbauen, einbauen: 😉

    #include <iostream> 
    #include <time.h>
    
    using std::cout; 
    using std::endl; 
    
    void sleep( clock_t wait )
    {
    	clock_t goal;
    	goal = wait + clock();
    	while( goal > clock() )
    		;
    }
    
    int main() 
    { 
    	int i = 1100; 
    
    	while(i) {
    		cout.width(10);
    		cout << i--;
    		for(int j=0;j<10;++j) cout << '\b';
    		sleep(10);
    	}
    
    	cout << endl; 
    
    	std::cin.get(); 
    	return 0x0; 
    }
    

    Danke _matze. Habe es ausprobiert und auch verstanden. Ich habe es jetzt jedoch so gemacht:

    while(sek >= 0)
    {
    	cout << setw(2);
    	cout << sek--;
    
    	for(int i = 0; i <= 1; i++)
    		cout << "\b";
    	Sleep(1000);
    }
    

    Danke natürlich auch an alle anderen!!!



  • Wenn du immer zum Zeilenanfang zurück willst kannst du auch einfach ein einzelnes \r ausgeben.



  • hustbaer schrieb:

    Wenn du immer zum Zeilenanfang zurück willst kannst du auch einfach ein einzelnes \r ausgeben.

    Danke, dasss weiß ich bereits. Werde es irgendwann mal gebrauchen 🙂



  • In C/C++ schreibt man bei den Abbruchbedingungen üblicherweise nur das < (statt <=) dann kann man die Anzahl der Durchläufe sehr einfach erkennen:

    for(int i = 0; i < 2; i++)\\ 2 Durchläufe
    

    Allerdings kannst du auch gleich die zwei \b direkt ausgeben.
    (aber der Compiler wird das eh optimieren)



  • DirkB schrieb:

    In C/C++ schreibt man bei den Abbruchbedingungen üblicherweise nur das < (statt <=)

    Also ich finde, das ist eigentlich reine Geschmackssache. Manchmal mach ich es so, manchmal aber auch anders 🤡



  • DirkB schrieb:

    In C/C++ schreibt man bei den Abbruchbedingungen üblicherweise nur das < (statt <=) dann kann man die Anzahl der Durchläufe sehr einfach erkennen:

    Im Prinzip ja. Nur schreibt man in C++ zunehmend != statt < und es gibt kein C/C++ (Beweis: Deine Vermutung.)


Anmelden zum Antworten