Passwort abfrage // Backspace
-
moses030 schrieb:
Muss ich das dann über eine if-anweisung abfragen ob ein backspace eingegeben wurde?
Probier da aus.
-
Probier es aus.
Blöde Smartphonetastatur
-
hrhr
also kein nein von dir heißt es muss funktionieren
-
Das hängt davon ab, wie du es implementierst.
Das mit der Eingabe ist kein Problem.
Die Rücknahme der * könnte schwieriger sein.
Darum: probier es aus.
-
Hallöle,
ich bin selbstverständlich nicht weiter gekommen
Ich habe allerdings einen ähnlichen Foreneintrag gefunden wo du manche sich von euch schon beteiligt haben.
Leider wurde der nie zuende geführt, so dass ich hier das ganze Thema wieder aufkramen muss. Positiv ist, das ich manches aus dem Eintrag mit verwenden kann.Hier mein Code:
#include<stdio.h> #include<string.h> int main() { char zeichen; char text[10+1]=""; char password[] ="Password"; int i; system("stty -icanon -echo"); for(i=0;i<10&&(text[i]=getc(stdin),text[i]!='\n');++i) printf("*"); if(text[i] =='\b') { text[strlen(text) -1] ='\0'; printf("\b\b\b"); } if(text[i] =='\n') { strtok(text,"\n"); if(strcmp(text, password) == 0) { printf("\nalles cool\n"); } else { printf("\na***** ist\n"); } } printf("\nEingabe zu lang!\n"); system("stty icanon echo"); return 0; }
Also der strcmp funktioniert. Er verlässt die Scheife falls zu mehr als 10 Zeichen eingegeben wurden..
Tjoa, das mit dem Backspace hab ich aus dem Code des anderen Eintrags, aber funktioniert natürlich nicht.
Ich hoffe mir kann jemand helfen. Ich würde gern hinkriegen, das der Backspace geht..Danke euch schonmal, bitte nicht zerpflücken falls der code scheiße ist, lieber tipps gehen damit ich ihn besser machen kann
Übung macht den Meister und von nichts kommt nichtsLiebe Grüße
-
Erstmal zum Backspace. Es bringt nichts, dreimal backspace auszugeben.
Einmal zurück, ein Leerzeiche zum Überschreiben und dann nochmal zurück, damit man wieder auf dem Leerzeichen steht. Alsoprintf("\b \b");
Wenn du ein Backspace eingegeben hast, möchtest du genau das überschreiben
Da brauchst du kein strelen, das \b steht an der Stelle i:text[i] ='\0';
Beim '\n' kannst du das genauso machen und sparst das strtok.
Im Augenblick kannst du 10 mal Backspace machen, überschreibst jedesmal den Speicher direkt vor text und hast kein gültiges Zeichen eingegeben.
Du musst also beim Backspace i-- machen. PAss aber auf, dass du nicht kleiner als 0 wirstDamit das Alles klappt, müsste die Backspacebehandlung allerdings auch mit in der Schleife sein.
Und schau dir mal
continue;
an
-
Hey Dirk,
danke für die vielen Tipps wieder.
Ich hab mich nochmal hingesetzt und eine andere Variante geschrieben.
#include<stdio.h> #include<string.h> int main() { char zeichen; char text[10+1]=""; char password[] ="Password"; int i =0; size_t count =0; system("stty -icanon -echo"); while((i<10) && (text[i] !='\n')) { text[i] =getc(stdin); if(text[i] !='\n') { if(text[i] =='\b') { if(count= strlen(text) >0) { text[i] ='\0'; printf("\b\b"); i--; } } else { printf("*"); i++; } } if(text[i] == '\n') { text[i] ='\0'; if(strcmp(text, password) ==0) { printf("\nalles cool\n"); break; } else { printf("\n alles nicht cool\n"); break; } } } system("stty icanon echo"); return 0; }
Leider klappt auch hier das nicht mit dem Backspace. Aber ich habe es doch mit in der Schleife. Könntest du dort mal rüber schauen und mich korrigieren?
Irgendwas muss ich ja falsch machen. Hab ich das denn mit dem
"Wenn du ein Backspace eingegeben hast, möchtest du genau das überschreiben
Da brauchst du kein strelen, das \b steht an der Stelle i:
C:
text[i] ='\0'; "richtig umgesetzt?
Liebe Grüße und vielen Dank
-
Was mir als erstes auffällt:
Finde den Unterschied zwischen:DirkB schrieb:
Also
printf("\b \b");
und:
moses030 schrieb:
printf("\b\b");
#include <stdio.h> int main() { char eingabe[11]; int pos = 0; int in; do { //getch() nimmt in der Win-Konsole ein Zeichen ohne Echo an in = getch(); if(in == '\b') { if(pos > 1) { printf("\b \b"); --pos; } continue; } //13 ist in der Windows-Konsole die Enter-Taste if(in == 13) break; eingabe[pos++] = in; putch('*'); } while(pos < 10); eingabe[pos] = 0; printf("\n\n*%s*\n", eingabe); }
-
Hallo danke für dein Beitrag Belli,
Also da ich ja in Linux progge, kann ich das nicht 1zu1 übernehmen. Laut ascii ist backspace doch auf 8? versteh ich nur nicht ganz, wenn ich :
if(in == 8) { if(pos > 1) { printf("\b \b"); --pos; }
eingebe, er mir nicht backspaced.
wenn da aber eine (if == 10) drin steht, backspaced er mir per enter.
Versteh ich nicht, die variante so wie du sie hast[ '\b'], ging bei mir gar nicht. da erkennt er mir die backspace taste erst gar nicht
stattdessen setzt er mir dann immer ein zeichen ran...
-
Ich kann Dir bei Deinem Linux-Problem nicht helfen. Wenn er Dir bei ASCII 10 (Enter) aber mit
printf("\b \b");
backspaced, bedeutet das doch, dass '\b' BACKSPACE ist
Dann sollte auchif(in == '\b')
funktionieren ...
Anderenfalls stellst Du vielleicht selbst mal fest, welchen ASCII - Code die Backspace - Taste auf Deinem System liefert?!
-
Da hast du absolut recht. Deshalb versteh ich's auch einfach nicht
Kann Vllt sonst jemand helfen?
-
moses030 schrieb:
Kann Vllt sonst jemand helfen?
Was ist denn derzeit dein Problem? Die Suche nach einem Linuxäquivalent zu getch?
-
Welche Taste drückst du, von der du der Meinung bist, es ist die Backspacetaste?
-
Na die Taste über der Enter Taste. Die längliche oben neben den Ziffern..
Es ist wahrscheinlich die falsche backspace oder was?
-
moses030 schrieb:
Na die Taste über der Enter Taste. Die längliche oben neben den Ziffern..
Es ist wahrscheinlich die falsche backspace oder was?
Ne, das ist die richtige.
(Aber es gibt noch andere Tasten mit Pfeilen drauf. Und manche verwirrt das.)Um zu sehen ob die Ausgabe von Backspace überhaupt auf dem Terminal funktioniert kannst du mal am Anfang vom Programm
printf("He\ballo: %d\n", '\b');
schreiben. Rauskommen sollte Hallo: 8
Um festzustellen welchen Code deine Taste liefert machst du nach dem getch
printf("(%d)",in);
-
Belli schrieb:
Anderenfalls stellst Du vielleicht selbst mal fest, welchen ASCII - Code die Backspace - Taste auf Deinem System liefert?!
-
Sooo, Problem gelöst!
Vielen Dank an Euch! mein Backspace ist 127. Problem könnte nur werden, wenn mein Prof das Programm bei sich testet könnte ja eine andere ascii zahl bei ihm sein oder? also sollte ich noch die 8 einfügen..
Jetzt funktioniert alles vielen Dank!
Ich weiß für euch ist es sicher nervenaufreibend. Für mich ist das eine große Hilfe, da ich mehr lernen wenn ich eure Tipps ausprobiere und gucke, anstatt da zu sitzen und eh nicht zu wissen wie ich es umsetze.
Vielen Dank nochmal!
-
moses030 schrieb:
mein Backspace ist 127.
Die Taste oder der Code für die Ausgabe oder Beides?
moses030 schrieb:
Problem könnte nur werden, wenn mein Prof das Programm bei sich testet könnte ja eine andere ascii zahl bei ihm sein oder? also sollte ich noch die 8 einfügen..
Definiere ein Makro (z.B BACKSPACETASTE) mit deinem Code und schreibe einen Kommentar (wieso, weshalb, warum) dazu.
moses030 schrieb:
Ich weiß für euch ist es sicher nervenaufreibend.
Wenn es so wäre, würde hier keiner antworten.
-
DirkB schrieb:
moses030 schrieb:
mein Backspace ist 127.
Die Taste oder der Code für die Ausgabe oder Beides?
Normal unter Linux wäre 127 als Tastencode für die Taste, die man als Backspace bezeichnet, und 8 für das Zeichen '\b'. Um tatsächlich 8/'\b' zu tippen, ist CTRL+H die übliche Tastenkombination.