Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

Geschrieben

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

Geschrieben

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

Geschrieben

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???)

Geschrieben


#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.

Geschrieben

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

Geschrieben

@ 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

Geschrieben

@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

Geschrieben

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.

Geschrieben

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.

Geschrieben

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

Geschrieben

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

Geschrieben

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.

Geschrieben
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:

Geschrieben

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)

Geschrieben

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

Geschrieben

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

Geschrieben

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.

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