Passwort abfrage // Backspace



  • Hallo, ich mal wieder...

    neues Programm neues Glück.

    Hier das Programm

    /*
    8. Realisieren Sie ein C-Programm, das eine Zeichenkette entgegennimmt,
       aber anstatt des Zeichens nur Sternchen "*" ausgibt. 
       Die Eingabe soll mit einer lokalen Vektor/Array-Variablen verglichen werden.
       Bei Übereinstimmung soll eine positive Meldung, andernfalls eine Fehlermeldung angezeigt werden.
       Optional soll die Eingabe der Zeichenkette über die Backspace-Taste korrigierbar sein.
       Tipp: Nutzen Sie die Escape-Sequenzen aus der Steuerzeichentabelle.
    
    Hinweis: Eingabe verstecken über -> system( "stty -echo" );
             Eingabe wieder anzeigen -> system( "stty echo" );
    
    Achtung: Das Kommando "stty" existiert nur unter LINUX! Windows Benutzer sollten
    anstatt "getchar()" die Funktion "getch()" aus der Bibliothek  nutzen. 
    */
    
    #include<stdio.h>
    #include<string.h>
    
    int main ()
    {
    	char korrektPw[] = "Password";
    	char eingabePw[10];
            char a;
     	int count =0;
    
    	printf("Bitte geben Sie ihr Password ein!\n");
    
    	system("stty -icanon -echo");
    
    	while(( a = getc(stdin)) != 10)
    	{
    
    		printf("*");
    		eingabePw[count++] =a;	
    		eingabePw[count] = '\0';
    
    	}
    
    			system("stty icanon echo");
    
    	if(strcmp(korrektPw, eingabePw) ==0)
    		{
    			printf("\nRichtiges Passwort!\n");
    		}
    	else
    		{
    			printf("\nFalsches Passwort!\n");
    		}
    
    	return 0;
    
    }
    

    Wie man sieht, nimmt er mir jetzt die Eingabe entgegen und printed mir "*" dafür aus.

    Wie schaffe ich es aber das er bei nem Backspace wieder returned?
    Kann man das mit nem Pointer regeln, der alle Zeichen prüft und bei nem '\b' wieder ein zurück geht? Wenn ja, könnte mir jemand nen lösungsansatz vorschlagen?

    Danke und Grüße



  • Benutze doch bitte Code-Tags und die Vorschau. Code markieren und auf den C-Button unter den Smilies clicken. Es gibt öffnende Tags und auch schließende.

    In der Aufgabe steht nichts von Backslash.

    Wenn du ein '\b' (das ist ein Zeichen) dann machst du --count.

    Bei der Ausgabe musst du mal schauen ob "\b \b" funktioniert.



  • Entschuldige bitte, war mankt der hecktig ier in der uni untergangen. Habs verbessert.

    Muss ich das dann über eine if-anweisung abfragen ob ein backspace eingegeben wurde?



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


Anmelden zum Antworten