Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » C++ Fehler

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
10.01.2010, 17:42 Uhr
Didldo



hallo leute,

bin neu hier und hab vorher schon ne weile ein C++ buch gelesen.
grad bin ich an nem programm (wie gesagt bin anfänger) bei dem das programm benutzrnamen und Pin checkt und bei falschen Angaben abbricht.
bin auch schon ziemlich weit. nur bei den letzten zeilen hab ich ein paar probleme.
wer mir helfen kann und mir den fehler erklären kann pls, melden!
hier ist mein angefangenes modell:


C++:
#include<iostream>
#include<string>

int main()
{
    bool Pin = 4876;
    Pin = true;
    bool Name = "Timmo";
    Name = true;
    std::cout<<"Geben sie ihre Pin und Benutzername ein"<< std::endl;
   std::cin>> Pin,Name;
   do
   {
   std::cout<<"Pin oder Benutzername falsch!"<< std::flush;
   {
   if(std::cin.good());
     break;
     }
     while(Pin,Name=false);
}


Dieser Post wurde am 13.01.2010 um 08:26 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
10.01.2010, 19:50 Uhr
ao

(Operator)


Die Datentypen passen nicht.

Name muss vom Typ std::string sein, damit es einen Benutzernamen speichern kann. Pin muss vom Typ int sein, wenn es eine Zahl speichern soll. Oder wahlweise ebenfalls vom Typ std::string, wenn die Pin als Zeichenkette abgespeichert werden soll.

Der Typ bool kann nur true oder false enthalten, das funktioniert hier nicht.

So weit erst mal.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
12.01.2010, 20:41 Uhr
Didldo



das hab ich jetzt gecheckt.
mein problem ist aber, dass ich keine möglichkeit finde, um sonst das programm zu schreiben.
zum einen muss ich benutzername und Pin angeben. gleichzeitig muss ich aber auch bestimmen, dass bei falschr eingabe nicht weiter gemacht wird. ich weiß nicht wie ich diese beide sachen kombinieren kann!
also wenn mir einer ne lösung vorschlage kann bin dankbar!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
13.01.2010, 03:45 Uhr
Hans
Library Walker
(Operator)


Hi,

aus einem C++ Buch:

C++:
#include <iostream>

using namespace std;

float x, y;
cout << "x: "; cin >> x;

if (! cin) {
   cerr <<"falsche Eingabe für x"; exit(1);
}

cout << "y: "; cin >> y;

if (! cin) {
   cerr <<"falsche Eingabe für y"; exit(1);
}

cout << "x + y = " << x+y << endl;


--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
15.02.2010, 15:48 Uhr
fr33g



Also ist doch eigentlich ganz leicht;-)

C++:
#include <iostream>
#include <string>

using namespace std;

bool check(string&, string&);

int main()
{
    cout<<"Geben sie einen neuen Benutzernamen an: ";
    string name;
    cin>>name;
    cout<<"Geben sie nun ein neues Passwort ein: ";
    string passw;
    cin>>passw;
    if(check(name,passw))
        cout<<"Die Eingaben waren richtig!";
    else
        cout<<"Die Eingaben sind nicht korrekt!";
}

bool check(string &user, string &pin)
{
    cout<<"Geben sie den Benutzernamen und das Passwort ein: ";
    string nameTemp;
    cin>>nameTemp;
    if(nameTemp==user)
    {
        string passwTemp;
        cin>>passwTemp;
        if (passwTemp==pin)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    else
    {
        return false;
    }
}



---
Edit: code-Tags zu cpp geändert.

Dieser Post wurde am 15.02.2010 um 15:57 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
15.02.2010, 16:10 Uhr
Hans
Library Walker
(Operator)


Hi,

die Variante hat aber auch noch zwei logische Fehler: Zum einen kannst Du Dir in der check-funktion die Abfrage sparen, denn Du übergibst ja das, was sie prüfen soll in den Parametern. Zum anderen überprüft sie nicht genau das, was ihr übergeben wird.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
15.02.2010, 19:07 Uhr
0xdeadbeef
Gott
(Operator)


Um mehrere Benutzer zu erlauben, wäre eine Abbildung (map) ein sinnvollerer Mechanismus. Außerdem empfiehlt es sich, die Passörter in irgendeiner Weise zu verschlüsseln, sonst kann jeder mit einfachen Mitteln deine Passwörter einsehen. Als Beispiel mit der UNIX-Funktion crypt könnte das etwa so aussehen:

C++:
#include <crypt.h>

#include <iostream>
#include <string>
#include <map>

class password_map {
public:
  typedef std::string                  user_t;
  typedef std::string                  password_t;
  typedef std::map<user_t, password_t> map_t;
  typedef map_t::const_iterator        const_iterator;

  // Nur zu Anschauungszwecken. Sinnvoller wäre etwa ein Konstruktor, der die
  // Passwort-Map aus einer Datei initialisiert.
  password_map() {
    users_["Timmo"] = "$1$F\"%1x?^3$3D2lLwnbct9j3YsHsx5Tj0";
  }

  bool check(user_t const &user, password_t const &pw) const {
    const_iterator i = users_.find(user);

    return i != users_.end() &&
           i->second == crypt(pw.c_str(), get_salt(i->second).c_str());
  }

private:
  static std::string get_salt(std::string pw_enc) {
    if(pw_enc[0] == '$') {
      return pw_enc.substr(0, pw_enc.find('$', 3));
    }

    return pw_enc.substr(0, 2);
  }

  map_t users_;
};

int main() {
  password_map pwmap;

  std::string user;
  std::string pw;

  std::cout << "Benutzername: " << std::flush;
  std::getline(std::cin, user);

  std::cout << "Passwort: "     << std::flush;
  std::getline(std::cin, pw  );

  if(!pwmap.check(user, pw)) {
    std::cerr << "Authentifikation fehlgeschlagen" << std::endl;
    return -1;
  }

  std::cout << "Rest des Programms." << std::endl;
}


Ich benutze crypt dabei, weil es sehr einfach (also anschaulich) ist und mir ein ihm enstprechendes Windows-API nicht bekannt ist.

Wenn Sicherheit nicht von Bedeutung ist, geht das natürlich auch so:

C++:
#include <iostream>
#include <string>
#include <map>

class password_map {
public:
  typedef std::string                  user_t;
  typedef std::string                  password_t;
  typedef std::map<user_t, password_t> map_t;
  typedef map_t::const_iterator        const_iterator;

  // Nur zu Anschauungszwecken. Sinnvoller wäre etwa ein Konstruktor, der die
  // Passwort-Map aus einer Datei initialisiert.
  password_map() {
    users_["Timmo"] = "4876";
  }

  bool check(user_t const &user, password_t const &pw) const {
    const_iterator i = users_.find(user);

    return i != users_.end() && i->second == pw;
  }

private:
  map_t users_;
};

int main() {
  password_map pwmap;

  std::string user;
  std::string pw;

  std::cout << "Benutzername: " << std::flush;
  std::getline(std::cin, user);

  std::cout << "Passwort: "     << std::flush;
  std::getline(std::cin, pw  );

  if(!pwmap.check(user, pw)) {
    std::cerr << "Authentifikation fehlgeschlagen" << std::endl;
    return -1;
  }

  std::cout << "Rest des Programms." << std::endl;
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 15.02.2010 um 19:09 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
15.02.2010, 19:46 Uhr
~f.-th.
Gast


Hab es mir nicht weiter angesehen:
Borland: free bcc5.5
der Digital Mars
und der MinGW
kennen eine wincrypt.h

MfG f.-th.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
15.02.2010, 21:30 Uhr
Hans
Library Walker
(Operator)


Hi,

die wincrypt.h kennt OpenWatcom auch. Die scheint auch zum WinAPI dazu zu gehören, denn in der MSDN steht eine Menge dazu; - hab's mir aber auch nicht näher angesehen. Hier mal zwei links:
The Cryptography API, or How to Keep a Secret
Cryptography

Aber wenn ich es mir recht überlege: Der Urheber dieses Threads hat sich nicht mehr gemeldet, und da er sich als Anfänger bezeichnet, sind wir ihm mit den Verschlüsselungsanwendungen wahrscheinlich ein paar Schritte zuweit voraus. Ich vermute eher, das es ihm nur um Stringvergleiche ging, und ihm dazu kein besseres Beispiel einfiel...

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 15.02.2010 um 21:36 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: