Forum: PC-Programmierung Bildschirmausgabe überschreiben


von Daniel S. (dani2304)


Lesenswert?

Hallo,
ich hätte ein Problem, ich würde gerne die Bildschirmausgabe für einen 
mit scanf() eingelesenen Text überschreiben.
1
char Zeichen[10]
2
int laenge, i;
3
printf("Geben Sie bitte 10 Zeichen ein");
4
scanf("%s",Zeichen);
5
strlen(Zeichen);
6
for(i=0;i<=Zeichen,i++) printf("*");  // Zeichen überschreiben mit '*'

Aber wie bekomme ich den Cursor an diese Stelle?

Also er soll die Eingabe überschreiben sobald man Enter gedrückt hat.

MfG

: Bearbeitet durch User
von Timmo H. (masterfx)


Lesenswert?

'\b'
Wenns bei jedem Tastendruck passieren soll dann jedes Byte einlesen und 
nicht einen String. getch oder getchar

: Bearbeitet durch User
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

1
char Zeichen[10]
2
int laenge, i;
3
printf("Geben Sie bitte 10 Zeichen ein");
4
scanf("%s",Zeichen);
5
strlen(Zeichen);
6
for(i=0;i<=Zeichen,i++) printf("*");  // Zeichen überschreiben mit '*'

Da sind ein paar hübsche Böcke versteckt.

Zunächst:

Wie wird in C das Ende eines Strings codiert?

Und wie lang muss ein String (d.h. ein char-Array) also sein, damit da 
eine gegebene Anzahl Zeichen hineinpasst?

Ist es also korrekt, ein char-Array mit zehn Elementen zu verwenden, 
wenn zehn Zeichen eingegeben werden sollen?

scanf ist eine ganz besonders schlechte Idee für Benutzereingaben. 
Was passiert in Deinem Programm, wenn der Benutzer auf der Tastatur 
einschläft und z.B. elf Zeichen oder noch mehr eingibt?

Welchen Sinn hat der Aufruf von strlen?

Deine for - Schleife sieht auch ... merkwürdig aus.

von Daniel S. (dani2304)


Lesenswert?

Eigentlich nehme ich auch immer den Befehl getsf() dafür. Dann wird das 
Stringende Zeichen auch sofort eingebaut. Aber der Benutzer soll zum 
Beispiel ein Passwort eingeben. Enter drücken und dann soll dieses 
Passwort mithilfe von '*' überschrieben werden.

von Stefan S. (Gast)


Lesenswert?

Daniel S. schrieb:
> wie bekomme ich den Cursor an diese Stelle?

Wie alt ist denn der Lehrer?

In C kann man den Cursor nicht einfach so Steuern, siehe etwa

http://stackoverflow.com/questions/26423537/how-to-position-the-input-text-cursor-in-c

Wenn man sich auf ein Betriebssystem festlegt is es wohl noch einfach.

Und wenn es eine ernsthafte Anwendung sein sollte, dann mag man auch 
nicht, dass das Passwort kurzzeitig am Bildschirm erscheint. Da würde 
man womöglich einzelne Tastendrücke direkt abfragen, daraus das Passwort 
zusammensetzen und immer nur ein * anzeigen. Aber auch das direkte 
Einlesen einzelner Zeichen (ohne Return) wird von C nicht direkt 
unterstützt. Irgendwas wie Getkey() order so muss man sich dann suchen, 
je nach OS.

von Stefan S. (Gast)


Lesenswert?


von Daniel S. (dani2304)


Lesenswert?

1
int main(void) {
2
    char Passwort[10];
3
    int i=0,j;
4
    do{
5
        Passwort[i]=getche();
6
        if(Passwort[i]!=8) i++;     // Normale Eingabe
7
        else{                       // Sonderfall: Backspace
8
            printf(" \b");          // Überschreibe Eingabe in Konsole
9
            if(i>0) i--;
10
        }
11
    }while(Passwort[i-1]!=13);
12
    for(j=0;j<i-1;j++)printf("*"); // Bei Drücken von Enter wird der vorherige Text überschrieben
13
}

Was haltet ihr hiervon? Unter Windows funktioniert das einwandfrei. Aber 
ich muss unter Linux programmieren. Da gibt es getche() nicht...

MfG

: Bearbeitet durch User
von S. R. (svenska)


Lesenswert?

Dann nimm getchar() oder getc().

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Daniel S. schrieb:
> Was haltet ihr hiervon?

Nicht viel. Das grundlegende Problem des buffer overflows hast Du nach 
wie vor nicht gelöst. Was geschieht, wenn der Benutzer mehr als zehn 
Zeichen eingibt?

von Daniel S. (dani2304)


Lesenswert?

Aber wenn ich das so mache brauche einen Befehl der die Charakter sofort 
abspeichert und nicht auf das Drücken von Enter wartet.

Gäbe es eine andere Möglichkeit, wenn ich zum Beispiel die Passwort 
Eingabe mit der Return Taste beende?

von Timmo H. (masterfx)


Lesenswert?

Lies doch jedes Zeichen einzeln ein und schreibe ihn in den Buffer 
solange die maximale Länge noch nicht erreicht wurde. Wenn '\n' gelesen 
wurde ersetzt du es durch '\0' und dein String (Passwort) ist komplett

: Bearbeitet durch User
von Nop (Gast)


Lesenswert?

Rufus Τ. F. schrieb:

> Nicht viel. Das grundlegende Problem des buffer overflows hast Du nach
> wie vor nicht gelöst. Was geschieht, wenn der Benutzer mehr als zehn
> Zeichen eingibt?

Ich habe nicht den Eindruck, daß der TE das auch nur ansatzweise 
begreift. Da ist schlichtweg Hopfen und Malz verloren.

von PittyJ (Gast)


Lesenswert?

Das ist schon der zweite Thread, wo der Daniel versucht sein fehlendes 
Wissen
hier schnell über das Forum korrigieren zu lassen.

Lieber Daniel. Du solltest zurück zu den Basics gehen, und erst einmal 
versuchen, die Sprache C zu verstehen. z.B: Wie sehen String aus. Wie 
terminiert man Strings. Was funktioniert die Abbruchbedingung bei einer 
For-Schleife genau.
Erst wenn das alles klar ist, dann versuche dich an etwas komplizierten 
wie die Cursor-Steuerung. Lass einfach die Eingabe noch hässlich und 
versuche erst einmal ein Programm korrekt hin zu bekommen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.