Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

dann schreiben wir die kbhit() halt selbst:


int kbhit(void)

{

  if(getchar()!=EOF)  //nächstes zeichen aus stdin holen und auf EOF prüfen

  {

     ungetc(stdin);  //Zeichen vorhanden, wieder zurückschreiben

     return 1;         //wahr zurückgeben

  }

  return 0;            //ansonsten falsch

}

Ich hab's nicht ausprobiert, müsste aber funktionieren

Geschrieben

Gets haut irgendwas überhaupt nicht mehr hin....:


...:~/C++ Dateien/Passwort> gcc -o Pass pass.cpp

pass.cpp: In function `int main()':

pass.cpp:18: error: syntax error before `{' token

pass.cpp: At global scope:

pass.cpp:25: error: syntax error before `return'

pass.cpp:29: error: `pass_cmp' was not declared in this scope

pass.cpp:29: error: ISO C++ forbids declaration of `strcpy' with no type

pass.cpp:29: error: `int strcpy' redeclared as different kind of symbol

/usr/include/string.h:83: error: previous declaration of `char* strcpy(char*,

   const char*)'

pass.cpp:29: error: initializer list being treated as compound expression

pass.cpp:32: error: ISO C++ forbids declaration of `printf' with no type

pass.cpp:32: error: `int printf' redeclared as different kind of symbol

/usr/include/stdio.h:329: error: previous declaration of `int printf(const

   char*, ...)'

pass.cpp:32: error: invalid conversion from `const char*' to `int'

pass.cpp:34: error: syntax error before `while'

pass.cpp:37: error: ISO C++ forbids declaration of `c' with no type

pass.cpp:39: error: syntax error before `if'

pass.cpp:48: error: `cnt' was not declared in this scope

pass.cpp:48: error: ISO C++ forbids declaration of `pass' with no type

pass.cpp:48: error: assignment (not initialization) in declaration

pass.cpp:49: error: syntax error before `++' token

pass.cpp:53: error: `cnt' was not declared in this scope

pass.cpp:53: error: ISO C++ forbids declaration of `pass' with no type

pass.cpp:53: error: assignment (not initialization) in declaration

pass.cpp:55: error: ISO C++ forbids declaration of `printf' with no type

pass.cpp:55: error: redefinition of `int printf'

pass.cpp:32: error: `int printf' previously defined here

pass.cpp:55: error: invalid conversion from `const char*' to `int'

pass.cpp:57: error: syntax error before `if'

Und nu???

Geschrieben

STOP ALLES ZURÜCK !!!!! habe ein ; vergessen ...sorry....

bekomme jetzt nur noch :

...:~/C++ Dateien/Passwort> gcc -o Pass pass.cpp

pass.cpp: In function `int main()':

pass.cpp:21: error: invalid conversion from `_IO_FILE*' to `int'

/usr/include/stdio.h:598: error: too few arguments to function `int ungetc(int,

FILE*)'

pass.cpp:21: error: at this point in file

Muss ich die GRöße des Passwortes ändern?? oder meint er andere arguments???

Das ist doch mal was.....

Geschrieben

Ich habe das jetzt mal ausprobiert und noch etwas ganz anderes festgestellt, das könnte aber Betriebssystem abhängig sein.

Was passiert auf dem Bildschirm wenn du getchar() benutzt ? Erscheinen bei der Passworteingabe Sternchen ("*") oder die Buchstaben die du eingegeben hast ?

Geschrieben

Weder noch, ich bekomme es gar nicht erst Compiliert. Ich benutze nur getchar().

Quelltext:

#include <stdio.h> // Einbinden der

#include <string.h> // benötigten Bibliotheken

/*

ACHTUNG DIE conio.h FUNKTIONIERT NICHT UNTER LINUX !!!!!!!!!!!ACHTUNG!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

*/

#define MAXZEICHEN 10 // maximale Anzahl an Zeichen im Passwort festlegen

main()

{

char c = 0;

char pass[MAXZEICHEN];

char pass_cmp[MAXZEICHEN]; // Variable für das Vergleichspasswort deklarieren

int cnt = 0;

int kbhit(void); // kbhit selber schreiben

{

if(getchar()!=EOF) //nächstes zeichen aus stdin holen und auf EOF prüfen

{

ungetc(stdin); //Zeichen vorhanden, wieder zurückschreiben

return 1; //wahr zurückgeben

}

else

{

return 0; //ansonsten falsch

}

}

strcpy(pass_cmp,"passwort"); // "passwort" nach pass_cmp kopieren

printf("Bitte geben Sie Ihr Passwort ein: ");

while( 1==1 ) // Endlosschleife

{

while(!kbhit()); // warte auf Tastendruck

c = getchar(); // schreibt eingabe nach c

if (c==13)

{

break;

}

if (cnt<MAXZEICHEN)

{

printf("*"); // Sternchen ausgeben

pass[cnt] = c; // Zeichen merken

cnt++; // Zähler erhöhen

}

}

pass[cnt] = '\0';

printf("\n\nDas eingegebene Passwort ist ");

if ( 0 == strcmp(pass,pass_cmp) ) // pass mit pass_cmp vergleichen

{

printf("\n\nRichtig 1");

}

else

{

printf("\n\nFalsch 0");

}

while(!kbhit()); // warte auf Tastendruck

return 0;

}

Geschrieben

Ich hab was gefunden, ist aber zu lang zum posten.

Die beiden Artikel beschrieben die Simulation der getch() und kbhit() Befehle unter Linux:

http://www.ohse.de/uwe/articles/getch.html

http:://www.ohse.de/uwe/articles/kbhit.html

Oder du versuchst mal folgende Variante:

http://www.pwilson.net/kbhit.html

[EDIT]

Oder probier mal das Beispiel, ist etwas kürzer:

http://www.flipcode.org/cgi-bin/fcarticles.cgi?show=64166

[/EDIT]

Geschrieben

Hallöchen zusammen,

ich habe das Programm nun, wie unten zu sehen, umgesetzt. Ich bekomme es auch Compiliert und kann es auch ausführen. Das nun noch vorhandene Problem ist, das ich das Passwort noch angezeigt bekomme und nicht wie eigentlich gewollt nur die Sternchen..... Ich brauche doch bloß nur einen Eintrag im Quelltext tauschen oder ???

#include <stdio.h> // Einbinden der 

#include <string.h> // benötigten Bibliotheken


/*

ACHTUNG DIE conio.h FUNKTIONIERT NICHT UNTER LINUX !!!!!!!!!!!ACHTUNG!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

*/


#define MAXZEICHEN 10 // maximale Anzahl an Zeichen im Passwort festlegen


    char c = 0;

    char pass[MAXZEICHEN];

    char pass_cmp[MAXZEICHEN]; // Variable für das Vergleichspasswort deklarieren

    int cnt = 0;


    int kbhit(void) // kbhit selber schreiben

    {

	if(getchar()!=EOF) //nächstes zeichen aus stdin holen und auf EOF prüfen

	{

	    // ungetc(stdin); //Zeichen vorhanden, wieder zurückschreiben

	    return 1; //wahr zurückgeben

	}


	else

	{

	    return 0; //ansonsten falsch

	}

    }


main()

{



    printf("Bitte geben Sie Ihr Passwort ein: ");


    while( 1==1 ) // Endlosschleife

    {

	while(!kbhit()); // warte auf Tastendruck

	c = getchar(); // schreibt eingabe nach c


	if (c==13)

	{

	    break;

	}


	if (cnt<MAXZEICHEN)

	{

	    printf("*"); // Sternchen ausgeben


	    pass[cnt] = c; // Zeichen merken

	    cnt++; // Zähler erhöhen

	}

    }


    strcpy(pass_cmp,"passwort"); // "passwort" nach pass_cmp kopieren

    pass[cnt] = '\0';


    printf("\n\nDas eingegebene Passwort ist ");


    if ( 0 == strcmp(pass,pass_cmp) ) // pass mit pass_cmp vergleichen

    {

	printf("\n\nRichtig 1");

    }


    else

    {

	printf("\n\nFalsch 0");

    }


    while(!kbhit()); // warte auf Tastendruck


    return 0;


}

Ich sage aber trotzdem Thanx für eure bisherigen Bemühungen und hoffe, dass ich euch nicht zu sehr strapaziert habe...???

Geschrieben

So trivial ist das Problem leider nicht, deshalb wurde unter DOS auch getch() implementiert, da es im Gegensatz zum ANSI-C Befehl getchar() die Zeichen aus stdin nicht "echot", also auf dem Bildschirm ausgibt. Und genau das ist auch dein Problem. Du musst dir den getch()-Befehl UND den kbhit()-Befehl aus einem der Beispiele aus den obigen Links "nachbauen" und diesen dann benutzen.

An dieser Stelle kann ich dir so nicht weiterhelfen, da ich nur Windows laufen habe und so diese Unix-spezifischen Dinge nicht nachvollziehen kann.

Geschrieben

Ahhhhh ha, na dann ist gut. Werde mal sehen wie ich das einbauen kann. Es läuft aber so auf nem Windowswürfel?? Wir haben in der Schule XP und Programmieren mit Borland x.x. Dürft ja wohl funktionieren....

Geschrieben

Ja, werde mal sehen wie ich das lösen werden, aber momentan fukell ich daran, das mir bei der Passworteingabe Sternchen und nicht das Passwort angezeigt wird. Da hänge ich zur Zeit..........

Geschrieben

Moment, kann sein das ich es nicht richtig erklärt habe.

Also, wenn der Satz kammt "bitte Passwort eingeben:" soll bei der Passworteingabe Sternchen angezeigt werden und nicht das Passwort. Dann soll das Passw. überprüft werden und wenn es dann Richtig ist soll eine 1 für richtig ausgegeben werden und wenn es falsch ist eine 0. Quasie wie bei einer Passworteingabe bei der Administratoranmeldung unter Windows....

Geschrieben
..., aber momentan fukell ich daran, das mir bei der Passworteingabe Sternchen und nicht das Passwort angezeigt wird. .....

Dann hast du dich sicherlich verschrieben.

Wie gesagt, implementiere die Beispiele aus den Links die ich gepostet habe, da getchar() jeden Tastendruck zwar im STDIN stream ablegt, ihn aber auch gleichzeitig auf dem Bildschirm ausgibt.

[EDIT]

ICH habe mich verlesen, der Satz war nicht ganz eindeutig. Hätte auch sein können, dass du versuchst, anstatt der Sternchen das Passwort angezeigt zu bekommen.

Sorry :floet:

[/EDIT]

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...