Passwort abfrage // Backspace



  • 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 nichts 🙂

    Liebe 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. Also

    printf("\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 wirst

    Damit 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 auch

    if(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?


  • Mod

    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.


  • Mod

    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.


Anmelden zum Antworten