Phade Geschrieben 11. Januar 2005 Teilen Geschrieben 11. Januar 2005 Hallo alle mit einander, Wir sollen für unseren Lehrer folgende Aufgabe erledigen: Schreiben Sie eine Funktion, die ein Passwort abfragt und es mit einer als Parameter übergebenen Zeichenkette vergleicht. Bei der Eingabe sollen nur Sternchen gezeigt werden. Als Ergebnis liefert die Funktion eine 1, wenn das Passwort korrekt war und sonst eine 0. Testen Sie das Programm. Informieren Sie sich zur Lösung dieses Problems in der Hilfe der IDE, welche Funktionen Ihnen in der Bibliothek string.h zur Verfügung stehen. Nun habe ich nichts gefunden über Passworteingabe oder dergleichen :confused: Das einzige was ich bis jetzt habe ist folgender Quelltext: #include <stdio.h> #include <string.h> #include <conio.h> main() { char *getpass(const char *prompt); printf("Bitte geben Sie Ihr Passwort ein: \n"); } Währe toll wenn Ihr mir helfen könnt. Im vorraus thanx Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 11. Januar 2005 Teilen Geschrieben 11. Januar 2005 Du könntest z.B mal hier im Forum danach suchen Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Phade Geschrieben 11. Januar 2005 Autor Teilen Geschrieben 11. Januar 2005 Habe ich. nur handeln die Themen meistens über Passwortabfrage im Webdisigne und nicht in C. Das ist ja der Mist, ich muss das eben in C machen und nicht wie andere mit HTML anfangen. Irgendwie ****t mich das an, das wir immer son Mist machen müssen. Selbst unsere Mittelstufe hat soetwas noch nicht gehabt!!!!! Versuche dann mal eine eigene Lösung zu finden.....irgendwo, auf einer kleinen Insel mit nem Server wird bestimmt etwas für zu finden sein....... Thanx Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Wurstpate Geschrieben 11. Januar 2005 Teilen Geschrieben 11. Januar 2005 Hi Du brauchst eine Funktion, die eine Zeichenkette übergeben bekommt. Das soll das korrekte Passwort sein. Die Funktion soll dann das Paswort einlesen, aber nur "*" anstatt den Buchstaben auf dem Bildschirm ausgeben. Also brauchst du eine Funktion, die Zeichenweise einliest, aber keine Ausgabe auf dem Bildschirm hat. Die musst du dann in eine Schleife packen, die solange läuft bis "Return" gedrückt wird. Im Schleifenkörper musst du dann eben noch die "*" ausgeben. Die einzelnen Zeichen müssen dann noch in einen String zusammengefügt werden. Dann müssen die Zeichenketten verglichen und je nachdem eine 1 oder eine 0 zurückgegeben werden. Jetzt viel Spass beim programmieren Wurstpate Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Phade Geschrieben 11. Januar 2005 Autor Teilen Geschrieben 11. Januar 2005 Ich werde mal sehen was ich so hinbekomme und werd dann mal mein Kunststück Präsentieren. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Phade Geschrieben 11. Januar 2005 Autor Teilen Geschrieben 11. Januar 2005 Also so weit bin ich gekommen. Mir fällt nichts mehr dazu ein.... #include <stdio.h> #include <string.h> main() { char password[10] = "Passwort"; printf("Bitte Passwort eingeben: ",%c); scanf("%c",&password); %c = getch(); if(blablabla) { printf("\n\n1 = Passwort Richtig!"); } else { printf("\n\n0 = Passwort Falsch!"); } return 0; } Ich weiß allerdings das da noch einiges fehlen dürfte bzw. das mein Versuch doch Fehler aufweist. (bin ich denn ansatzweise auf dem richtigen Weg???) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
computercrustie Geschrieben 11. Januar 2005 Teilen Geschrieben 11. Januar 2005 #include <stdio.h> #include <conio.h> //maximale Anzahl an Zeichen im Passwort #define _MAXZEICHEN 10 void main(void) { char c = 0; char pass[_MAXZEICHEN]; int cnt = 0; std::cout<<"Bitte geben Sie Ihr Passwort ein:"; while( 1==1 ) //endlosschleife { while(!_kbhit()); //warte bis taste gedrückt c = _getch(); //tastencode nach c auslesen if (c==13) //wenn return gedrückt dann ende break; if (cnt<_MAXZEICHEN) { std::cout<<"*"; //Sternchen ausgeben pass[cnt] = c; //zeichen merken cnt++; //zähler erhöhen } } pass[cnt] = 0; //letztes element in pass[] auf \0 setzen std::cout<<std::endl<<pass<<std::endl; while(!_kbhit()); } Das eingegebene Passwort steht am Ende in "pass" und kann dann verglichen werden. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Wurstpate Geschrieben 11. Januar 2005 Teilen Geschrieben 11. Januar 2005 Hi Noch eine Frage: Soll das Programm nur unter Windows laufen? Weil soweit ich weiß ist die "getch"-Funktion betriebssystemabhängig. Wenn ja, ist die Funktion aber schonmal ein guter Ansatz, weil die die Zeichen nicht auf dem Bildschirm ausgibt. Noch ein paar Denkhilfen: - es soll eine Funktion rauskommen, die etwas tut, also musst du das einlesen und überprüfen aus der main auslagern, und die geschriebene Funktion in main mit dem richtigen Passwortaufrufen - du musst den Wert der übergebenen Variable speichern und darfst den nicht direkt wieder ersetzen - Du wirst in einer Lösung mit getch eine Schleife brauchen, in der du getch immer wieder aufrufen kannst, bis Return gedrückt wird. Versuch das mal umzusetzen und dann poste dein Ergebnis wieder. Dann schauen wir mal weiter. Wurstpate Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Phade Geschrieben 11. Januar 2005 Autor Teilen Geschrieben 11. Januar 2005 @ computercrustie: Ok, ich habe dein Quelltext halbwegs verstanden. Was bedeutet denn while(1==)... ???, sowie if(c==13)...??? und meine letzte Frage währe, wie sage ich denn dem Programm das er das Passwort vergleichen soll? Mit if/else ??? Ach, muss ich nicht noch irgendwo das Passwort deklarieren, damit es verglichen werden kann??? Habe ich dein Quelltext doch nicht verstanden ????? Für heute ist erst mal schluss.....ich mach jetzt Feierabend.....gucke mal zu Hause ob ich da was noch gebacken bekomme. Melde mich morgen dann... Thanx and c u Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
bmg4ever Geschrieben 11. Januar 2005 Teilen Geschrieben 11. Januar 2005 @phade: ich will ja nix sagen, aber was "while (1==1)" bedeutet steht doch im kommentar daneben. es handelt sich hierbei schlicht um eine endlosschleife. was "if (c == 13)" bedeutet steht, oh wunder, ebenso im ordentlich kommentierten quelltext von computercrustie. [QOUTE] //wenn return gedrückt dann ende [/QOUTE] die 13 steht hier für das CarriageReturn Zeichen in einer Char-Variablen. Die Nummer 13 kommt aus dem Ascii-Code, wo Enter die Dezimalnummer 13 hat Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 11. Januar 2005 Teilen Geschrieben 11. Januar 2005 Wie du ja weißt läuft die while Schleife solange wie die Bedingung in der Klammer wahr ist. Der Operator == vergleicht 2 simple datentypen auf ihre gleichheit und liefert wahr oder falsch zurück. Wenn du nun 1 mit 1 vergleichst hast du immer das selbe Ergebnis, nämlich das sie gleich sind (also wahr) und die Schleife läuft unendlich oft. Genauso gut könntest du while(1) schreiben, weil in C die 0 als falsch und alles andere als wahr interpretiert wird. Um zwei Strings in C zu vergleichen kannst du die funktion strcmp benutzen und deren Rückgabewert prüfen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
computercrustie Geschrieben 12. Januar 2005 Teilen Geschrieben 12. Januar 2005 bmg4ever und Guybrush Threepwood haben ja schon alles gesagt, deshalb hier nur die Implementation des Passwortvergleichs: char pass_cmp[_MAXZEICHEN]; //variable für das vergleichspasswort deklarieren strcpy(pass_cmp,"passwort"); //"passwort" nach pass_cmp kopieren //... //hier den vorigen code bis ende der while-schleife einfügen //... std::cout<<std::endl<<"Das eingebene Passwort ist "; if ( 0 == strcmp(pass,pass_cmp) ) //pass mit pass_cmp vergleichen std::cout<<"richtig."; else std::cout<<"falsch."; std::cout<<std::endl; while(!_kbhit()); //warten bis taste gedrückt } In diesem einfachen Fall kannst du den String-Vergleich mittels strcmp auch so durchführen: if (strcmp(pass,"passwort") == 0) ... Da sparst du dir die Deklaration einer Passwortvariablen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Phade Geschrieben 12. Januar 2005 Autor Teilen Geschrieben 12. Januar 2005 die 13 steht hier für das CarriageReturn Zeichen in einer Char-Variablen. Die Nummer 13 kommt aus dem Ascii-Code, wo Enter die Dezimalnummer 13 hat Hey, genau das wollte ich eigentlich nur wissen! Bei der Endlosschleife muss ich gestehen, habe ich etwas gepennt :floet: Werde dann jetzt mal versuchen eure "Anregungen" umzusetzen... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Phade Geschrieben 12. Januar 2005 Autor Teilen Geschrieben 12. Januar 2005 Moin Moin, also hier ist das, was ich nun umgesetzt habe: #include <stdio.h> // Einbinden der #include <conio.h> // benötigten Bibliotheken #define _MAXZEICHEN 10 // maximale Anzahl an Zeichen im Passwort main() { char c = 0; char pass[_MAXZEICHEN]; char pass_cmp[_MAXZEICHEN]; // Variable für das Vergelichspasswort deklarieren int cnt = 0; 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 = getch(); // schreibt eingabe nach c if (c==13) { break; } if (cnt<_MAXZEICHEN) { printf("*"); // Sternchen ausgeben pass[cnt] = c; // Zeichen merken cnt++; // Zähler erhöhen } } 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()); return 0; } Anbei aber nun noch die Compiler Fehlermeldungen, die ich nicht richtig einordnen kann: :~/C++ Dateien/Passwort> gcc -o Pass pass.cpp pass.cpp:2:47: conio.h: Datei oder Verzeichnis nicht gefunden pass.cpp: In function `int main()': pass.cpp:13: error: `strcpy' undeclared (first use this function) pass.cpp:13: error: (Each undeclared identifier is reported only once for each function it appears in.) pass.cpp:20: error: `_kbhit' undeclared (first use this function) pass.cpp:21: error: `getch' undeclared (first use this function) pass.cpp:39: error: `strcmp' undeclared (first use this function) Ich habe schon einiges versucht, wie andere Bibliotheken oder versucht einiges umzuschreiben.... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 12. Januar 2005 Teilen Geschrieben 12. Januar 2005 Du könntest auch einfach in deine Dokumentation schauen. Da steht, welche Header die verwendeten Funktionen benötigen. Ein #include <string.h> könnte schon mal weiterhelfen. Du solltest keine Präprozessorsymbole definieren, die mit einem Unterstrich anfangen. Das ist dem Compiler vorbehalten. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Phade Geschrieben 12. Januar 2005 Autor Teilen Geschrieben 12. Januar 2005 Du könntest auch einfach in deine Dokumentation schauen. Da steht, welche Header die verwendeten Funktionen benötigen. Ein #include <string.h> könnte schon mal weiterhelfen. Du solltest keine Präprozessorsymbole definieren, die mit einem Unterstrich anfangen. Das ist dem Compiler vorbehalten. Ok, habe ich mal dazugefügt und bekomme trotzdem noch diese Fehlermeldungen: ...:~/C++ Dateien/Passwort> gcc -o Pass pass.cpp pass.cpp:2:47: conio.h: Datei oder Verzeichnis nicht gefunden pass.cpp: In function `int main()': pass.cpp:10: error: `MAXZEICHEN' undeclared (first use this function) pass.cpp:10: error: (Each undeclared identifier is reported only once for each function it appears in.) pass.cpp:14: error: `pass_cmp' undeclared (first use this function) pass.cpp:21: error: `kbhit' undeclared (first use this function) pass.cpp:22: error: `getch' undeclared (first use this function) pass.cpp:33: error: `pass' undeclared (first use this function) Sorry aber momentan verstehe ich den Compiler nicht :confused: Werde mal fünf Minuten Pause machen und dann nochmal ranklotzen :mod: Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
bmg4ever Geschrieben 12. Januar 2005 Teilen Geschrieben 12. Januar 2005 dir fehlt anscheinend die conio-headerdatei (warum die nicht da ist, weiß ich allerdings auch nicht) ------------------------------------------------------------------- pass.cpp:10: error: `MAXZEICHEN' undeclared (first use this function) ------------------------------------------------------------------- da musste dich irgendwo vertippt haben beim ändern mit dem unterstrich und nochwas. deine passwortabfrage wird auch nicht funktionieren, wenn du die ganzen undeclared probleme gelöst hast. dir fehlt folgendes: while( 1==1 ) // Endlosschleife { ... } pass[cnt] = '\0'; //NEU!!// ... Du musst das letzte Zeichen deines char-Array mit diesem String-Ende-Zeichen besetzten, damit die Funktion strcmp richtig funktioniert, da ansonsten, soweit ich weiß, das ergebnis immer null ist, da die länge beider strings schon nicht übereinstimmt, da strcmp halt denkt, dass die länge die vollen 10 Zeichen des Arrays wären. (bitte nicht lünchen wenns nicht stimmt, so hab ich mir das selbst erklärt) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Phade Geschrieben 12. Januar 2005 Autor Teilen Geschrieben 12. Januar 2005 Ok, habe den Fehler entdenkt und beseitigt. Ich verstehe gerade selbst nicht, warum er die conio.h nicht findet. Habe sie ihm ja am Anfang mit includet. Habe jetzt noch folgende Meldung: ...:~/C++ Dateien/Passwort> gcc -o Pass pass.cpp pass.cpp:2:47: conio.h: Datei oder Verzeichnis nicht gefunden pass.cpp: In function `int main()': pass.cpp:21: error: `kbhit' undeclared (first use this function) pass.cpp:21: error: (Each undeclared identifier is reported only once for each function it appears in.) pass.cpp:22: error: `getch' undeclared (first use this function) Warum kennt er denn nicht kbhit :confused: ebenso wie getch :confused: Was habe ich vergessen :confused: .... Ich muss nachdenken, nachdenken .... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
computercrustie Geschrieben 12. Januar 2005 Teilen Geschrieben 12. Januar 2005 Compilierst du unter Linux ? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Phade Geschrieben 12. Januar 2005 Autor Teilen Geschrieben 12. Januar 2005 Jawoll. SuSE Linux 9.1 Pro. Kennst du dich da ein büschen aus ??? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
computercrustie Geschrieben 12. Januar 2005 Teilen Geschrieben 12. Januar 2005 Nein, aber so weit ich es lesen konnte, gibt es unter Linux kbhit() und getch() nicht (es sei denn, eine entsprechende Implementation ist vorhanden:) http://www.tek-tips.com/viewthread.cfm?qid=939697&page=1 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 12. Januar 2005 Teilen Geschrieben 12. Januar 2005 guck mal hier: http://www.fun-soft.de/showtopic.php?threadid=5157&time=1090580969 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Phade Geschrieben 12. Januar 2005 Autor Teilen Geschrieben 12. Januar 2005 Sorry, aber trotz eurer Tips hat es nicht Funktioniert. Ich habe einige Bibliotheken übernommen aber es hat nichts genütz. Bekomme immer noch ...:~/C++ Dateien/Passwort> gcc -o Pass pass.cpp pass.cpp: In function `int main()': pass.cpp:13: error: `strcpy' undeclared (first use this function) pass.cpp:13: error: (Each undeclared identifier is reported only once for each function it appears in.) pass.cpp:20: error: `kbhit' undeclared (first use this function) pass.cpp:21: error: `getch' undeclared (first use this function) pass.cpp:41: error: `strcmp' undeclared (first use this function) So langsam kapier ich es nicht mehr....... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
computercrustie Geschrieben 12. Januar 2005 Teilen Geschrieben 12. Januar 2005 Nimm als erstes mal wieder den <string.h> Header rein, damit strcpy und strcmp bekannt sind. Jetzt includiere bitte die <stdio.h> und ersetze getch() mit getchar() oder getc(stdin). Probier das bitte mal aus. Sollte es funktionieren, dann habe ich auch schon die Lösung für dein kbhit() Problem. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Phade Geschrieben 12. Januar 2005 Autor Teilen Geschrieben 12. Januar 2005 Ok das mit getchar hat gefunzt!! Jtzt meckert er nur noch über det kbhit!!! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.