Login



  • Verwende Strings statt Char[]

    #include <iostream>
    #include <conio>
    #include <iomanip>
    #include <string>   <--- nicht <string.h>
    using namespace std;
    
    void main()
    {
    //------------------------------------------- Variablenvereinbarung -------
       string login;
       bool authorized;
    //------------------------------------------- Progi starten ---------------
       authorized = false;
       while( !authorized ) {
        cout<<"Logon:\n";
        cout<<"------\n";
        cin>>login;
    
        clrscr();
    
        if (login == "test")
        {
          clrscr();
          gotoxy (15,10);
          cout<<"*** Login Erfolgreich ***\n";
          gotoxy (15,12);
          cout<<"-------------------------\n\n";
          gotoxy (15,20);
          cout<<"supported by MySelf xD!!!";
          authorized = true;
        }
        else
        {
          clrscr();
          cout<<"*** Verweigert ***\n";
          cout<<"------------------";
        }
       }  // end while
       getch();
    }
    


  • @Maddyn:
    Erstmal solltest du die neuen Header (ohne .h) verwenden und dir wie Michael E. schon sagte ein Tutorial zu std::string durchlesen. Außerdem ist der Rückgabetyp von main int und niemals void.
    Kleine Übersicht über std::string findest du z.B. hier:
    http://www.cppreference.com/cppstring/index.html

    Am Besten guckst du mal in die Tutorial-Ecke. 🙂

    Edit:
    Zum Vergleich von char-Arrays benötigst du die entsprechenden String-Funktionen aus der Headerdatei cstring (in C: string.h und nicht zu verwechseln mit der Headerdatei string). Die str...-Funktionen sind das was du benötigst:
    http://www.cppreference.com/stdstring/index.html
    Zum Vergleich zweier Strings benötigst du strcmp oder strncmp.



  • char login;
    

    und dann kommt

    login == 'test'
    

    Wie stellst du dir das vor? Stell dir vor du sollst einen Bus für eine Betriebsfahrt bestellen. Man sagt dir, dass insgesamt 50 Personen mitfahren werden. Also was machst du? Du bestellst einen Bus für 50 Personen. Als ihr abfahren wollt kommen dann plötzlich 70! Also was machst du? Richtig! Du schmeißt die überschüssigen 20 raus! Und so ist es auch bei deinem char. Es kann ein Zeichen aufnehmen, aber du verlangst von ihm das es 4 nehmen soll?! Da denkt sich dein Programm "Vergiss es!" und nimmt trotzdem nur ein Zeichen auf. Nähmlich das 1.. Also wenn du 4 Zeichen aufnehmen willst, musst du das dem Programm auch sagen:

    char login[4];
    

    @Vellas: main ist niemals void? Sieh und staune:

    #include <iostream.h>
    #include <windows.h>
    using namespace std;
    
    void main ()
    {
        cout << "Hallo Welt!";
    	Sleep (2000);
    }
    

    Kompiliere das Programm, und du wirst feststellen, das auch main void sein kann!

    Mfg Ominion

    PS: Guck dir den string-Header trotzdem mal an, der kann sehr nützlich sein.



  • @Ominion:
    Nur weil es kompiliert wird muss es nicht richtig sein.



  • Ominion schrieb:

    @Vellas: main ist niemals void? Sieh und staune:

    #include <iostream.h>
    #include <windows.h>
    using namespace std;
    
    void main ()
    {
        cout << "Hallo Welt!";
    	Sleep (2000);
    }
    

    Kompiliere das Programm, und du wirst feststellen, das auch main void sein kann!

    LOL 👎
    du bist so ein schlechter troll!

    habs mal für dich kompiliert:

    In Datei, eingefügt von /usr/include/c++/4.0.2/backward/iostream.h:31,
    von test.cpp:1:
    /usr/include/c++/4.0.2/backward/backward_warning.h:32:2: Warnung: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <iostream> instead of the deprecated header <iostream.h>. To disable this warning use -Wno-deprecated.
    test.cpp:5: Fehler: »::main« muss »int« zurückgeben
    test.cpp: In function »int main()«:

    wow 😮
    gleich 2 verschiedene fehler :p



  • Bei mir gibt das

    test.cpp(1): fatal error C1083: Include-Datei kann nicht geöffnet werden: 'iostream.h': No such file or directory



  • Soll ich euch das Programm ma schicken? Bei mir hat das so funktioniert! Das kann dann nur an deinem Compiler leigen.

    Mfg Ominion



  • Ich weiß nicht, wie oft ich diese Stelle aus dem Standard schon zitiert habe.

    International Standard ISO-IEC 14882 Kapitel 3.6.1 Abschnitt 2 schrieb:

    An implementation shall not predefine the main functino. This function shall not be overloaded. It shall have a return type of type int, but otherwise its type is implementation-defined. All implementations shall allow both of the following definitions of main:
    int main() { /* ... / }
    and
    int main(int argc, char
    argv[]) { /* ... */ }
    [...]

    Also, Ominion, freu dich, dass dein Compiler was unterstützt, das nicht im Standard steht, aber wunder dich dann nicht, dass es nicht auf allen Compilern funktioniert.



  • es liegt an deinem compiler. und zwar daran, dass er
    a) veraltet oder
    b) alte standards unterstützt...

    Aber: Don't feed the trolls...



  • @Michael E.: Ich wollte ja damit nicht sagen, dass man das so machen muss, sondern (genau das gleiche was du gesagt hast), dass das bei einigen Compilern eben funktioniert
    @cin: Eher das 2.. Und: Falls du dich auf das bezogen hast:

    Ich habe geschrieben schrieb:

    Soll ich euch das Programm ma schicken? Bei mir hat das so funktioniert! Das kann dann nur an deinem Compiler leigen.

    Damit wollte ich nicht trollen, sondern das war ernst gemeint (mir ist zwar im Nachhienein eingefallen, dass das gar nichts bringt, da ihr den Quellcode dann immer noch nicht seht, aber das ist dann wieder eine andere Geschichte...).

    Mfg Ominion





  • Von Bjarne persönlich: http://public.research.att.com/~bs/bs_faq2.html#void-main

    Nur weil etwas auf einem Compiler läuft muss das nicht auf nem anderen laufen, wie du eben gesehen hast. Deswegen ist es so wichtig sich an den Standard zu halten, wenn man portabel sein möchte.



  • Also danke erstmal an alle die hier so fleissig gepostet haben.

    Mit einer solch großen Resonanz hätte ich nicht gerechnet.
    In der Schule haben wir damals void main() benutzt bevor wir zu funktionsaufrufen kamen und deswegen ist das noch hängen geblieben.

    Bei mir funktioniert es auch, liegt wohl daran das ich den Borland Builder 4 benutze. War der einzige den ich hier so rumliegen hatte und mit dem ich alles gelernt habe, deswegen wollte ich den auch weiterhin benutzt. Wußte nicht das damit schon in der Steinzeit lebe xD

    Ich habs nun bei mir angepasst und es funktioniert fast alles Prima. Nur wenn ich den falschen Wert eingebe, dann sagt er zwar verweigert allerdings ist der neue Login dann genau drunter und sieht irgendwie "komisch" aus. Er löscht das "verweigert" nicht raus mit clrscr(); sondern behält es bei bis ich eben den richtigen Login habe. Liegt das nun wieder an meinem Builder?

    Und ne kleine Frage noch. Wie kann ich einen ausgebenden Text langsamer anzeigen lassen? Also nicht das plötzlich alles zu lesen ist sondern er alles langsamer aufbaut, als wäre mein Rechner uralt mit der Rechenpower einer ausgedrückten Zitrone 😃 Ich hoffe ich habe mich halbwegs korrekt ausgedrückt.

    Vielen Danke schonmal an alle

    mfg

    Maddyn



  • Hi

    Du solltest das clrscr();
    vor der ersten Ausgabe aufrufen, also gleich nach dem while..



  • ok vielen dank habs hinbekommen.

    ich merk das ich nun aber keine verschaltelungen von if und else machen kann.
    Gibs da andere möglichkeiten? Achja hier das was ich versucht habe:

    //------------------- Login --------------------
    
    #include <iostream>
    #include <conio>
    #include <iomanip>
    #include <string>
    using namespace std;
    
    void main()
    {
    //------------------------------------------- Variablenvereinbarung -------
       string login;
       bool authorized;
    //------------------------------------------- Progi starten ---------------
       authorized = false;
       while( !authorized ) {
    
        gotoxy (15,14);
        cout<<"Logon:\n";
        gotoxy (15,15);
        cout<<"------\n";
        gotoxy (15,17);
        cin>>login;
    
        clrscr();
    
        if (login == "yoshua")
        {
          clrscr();
          gotoxy (15,10);
          cout<<"*** Login Erfolgreich ***\n";
          gotoxy (15,12);
          cout<<"-------------------------\n\n";
          gotoxy (15,20);
          cout<<"supported by MySelf xD!!!";
          authorized = true;
        }
        else
        {
          if (login == "list games")
          {
          cout<<"Schach";
          cout<<"dame";
          authorized = true;
          }
          else
          {
          clrscr();
          gotoxy (15,10);
          cout<<"*** Verweigert ***\n";
          gotoxy (15,11);
          cout<<"------------------\n\n\n";
          }
        }
       }  // end while
       getch();
    }
    

    Also es funktioniert auch nicht wenn ich das authorized = true; rauslasse.



  • #include <iostream>
    #include <windows>
    #include <string>
    using namespace std;
    
    int main ()
    {
    	string loginuser = "User";
    	string loginpass = "passwort";
    	string user;
    	string pass;
    	bool login = false;
    
    	while (!login)
    	{
    		cout << "Loginname: ";
    		cin >> user;
    
    		if (loginuser == user)
    		{
    			cout << "Loginpasswort: ";
    			cin >> pass;
    
    			if (loginpass == pass)
    			{
    				cout << endl;
    				cout << "Login erfolgreich!" << endl;
    
    				login = true;
    			}
    			else
    			{
    				cout << endl;
    				cout << "Das Passwort ist leider nicht korrekt." << endl;
    				cout << endl;
    
    				login = false;
    			}
    		}
    		else
    		{
    			cout << endl;
    			cout << "Der Name ist leider nicht korrekt." << endl;
    		    cout << endl;
    
    			login = false;
    		}
    	}
    
    	Sleep (2000);
    
    	return 0;
    }
    

    Also ich habe das jetzt mal schnell eingetippt. Das müsste so funktionieren. Du kannst ja mal gucken, was du übernimmst oder was du an deinem Programm änderst. Das ist jedensfalls eine Möglichkeit, die so funktionieren müsste (habe versucht, die an deine anzulehnen).

    Mfg Ominion



  • cin>>login;
    

    Änder das zu

    getline(cin, login);
    

    die Folge ist, dass nicht bis zum nächsten Leerzeichen, sondern bis zum nächsten \n nach login kopiert wird.



  • Ominion: Grausam. Versuch mal nicht so tief zu verschachteln:

    // nur Struktur verändert
    #include <iostream>
    #include <windows>
    #include <string>
    using namespace std;
    
    int main ()
    {
        string loginuser = "User";
        string loginpass = "passwort";
        string user;
        string pass;
        bool login = false;
    
        while (!login)
        {
            cout << "Loginname: ";
            cin >> user;
    
            if (loginuser != user)
            {
            	cout << "Der Name ist leider nicht korrekt." << endl;
                continue;
            }
    
            cout << "Loginpasswort: ";
            cin >> pass;
    
            if (loginpass != pass)
            {
            	cout << "Das Passwort ist leider nicht korrekt." << endl;
                continue;
            }
    
            cout << "Login erfolgreich." << endl;
            login = true;
        }
    
        Sleep (2000);
    
        return 0;
    }
    


  • An continue habe ich so schnell garnicht gedacht! Zu getline(): Ist ja erstmal egal. Das wird dann nur relevant, wenn man die Daten dann aus einer Datenbank auslesen kann, und sich User richtig registrieren können. Aber für Testzwecke brauch man das noch nicht

    Mfg Ominion



  • @Maddyn: Du kannst das else auch weglassen!

    Mfg Ominion


Anmelden zum Antworten