Benutzerregistrierung. Fehrbesserungsvorschläge gesucht!



  • Absolut nicht umfangreich, z.B. kann man bereits erstellte Benutzer einfach überschreiben, aber bevor ich das weiter ausbaue wollte ich mal einige Könner den Code zerfleischen lassen. 😋
    Ich lerne C erst seit knapp zwei Wochen nur via Internet! 🙄

    Bittesehr:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    void chomp(char *str) {
    size_t p=strlen(str);
    str[p-1]='\0'; }

    int main(int argc, char *argv[])
    { FILE *UserNameSave;
    FILE *UserPWSave;

    char getUserName [20];
    char bufferUserName [24];
    const char* FileUserName;

    char getUserPW1 [20];
    char getUserPW2 [20];
    char bufferUserPW [30] = {"PW"};
    const char* FileUserPW;

    int decisionName;
    int decisionPW;

    do{

    printf ("Willkommen bei DD V1.0!\n\nLegen sie zunaechst ihren Benutzernamen und ihr Passwort fest.\n\nBenutzername: ");
    fgets(getUserName,20,stdin);
    chomp(getUserName);

    system("Cls");
    printf("Moechten sie %s als Benutzernamen festlegen?\n\n [1] Ja | [2] Nein | [3] Benutzerkontenerstellung abbrechen",getUserName);
    decisionName=getch();

    system("Cls");
    if(decisionName=='3') {
    return 0;}
    }while(decisionName!='1');

    strcpy(bufferUserName,getUserName);
    strcat(bufferUserName,".txt");
    FileUserName = bufferUserName;

    system("Cls");

    do{
    do{
    printf("Erster Schritt zum Erstellen des Benutzerkontos '%s' erfolgreich!\n\nWaehlen sie nun ihr Passwort\n\nPasswort: ",getUserName);
    fgets(getUserPW1,20,stdin);
    chomp(getUserPW1);
    printf("\nPasswort wiederholen: ");
    fgets(getUserPW2,20,stdin);
    chomp(getUserPW2);
    system("Cls");
    }while((strcmp(getUserPW1,getUserPW2))!=0);

    printf("Moechten sie dieses Passwort festlegen?\n\n [1] Ja | [2] Nein | [3] Benutzerkontenerstellung abbrechen");
    decisionPW=getch();
    system("Cls");
    if(decisionPW=='3'){
    return 0; }
    }while(decisionPW!='1');

    strcat(bufferUserPW,bufferUserName);
    FileUserPW = bufferUserPW;

    if((UserNameSave = fopen(FileUserName, "w")) == NULL) {
    fprintf(stderr, "Erstellen des Kontos fehlgeschlagen.");
    return 1;
    }
    else {
    fprintf(UserNameSave, "%s", getUserName);
    }
    if((UserPWSave = fopen(FileUserPW, "w")) == NULL) {
    fprintf(stderr, "Erstellen des Kontos fehlgeschlagen.");
    return 1;
    }
    else{
    fprintf(UserPWSave, "%s", getUserPW1);
    }

    fclose(UserNameSave);
    fclose(UserPWSave);

    system("PAUSE");

    return 0;
    }
    [code="c"][code]



  • MrSonak schrieb:

    Ich lerne C erst seit knapp zwei Wochen nur via Internet!

    Das sieht man. Absoluter Schrott.

    MrSonak schrieb:

    Fehrbesserungsvorschläge

    C kannst du nicht und Deutsch auch nicht.



  • Das Programm ist noch recht verbesserungswürdig:
    - vermeide system().
    - fclose für die erste Datei wird bei einem Fehler beim Öffnen der zweiten nicht aufgerufen
    - deklariere variablen da, wo du sie brauchst, nicht immer irgendwo ganz weit oben in einer Funktion. Geht ab C99.
    - wird dein Programm komplexer, solltest du komponenten in verschiedene Funktionen auslagern und daten und objekte in strukturen zusammenfassen. Bastle dir beispielsweise Funktionen für Login, Hauptmenu, Einlesen der Benutzerdaten, Anlegen von Kontos und wiedereinlesen derselben; in einer Struktur kannst du Daten zu einem Benutzer hinterlegen. Auch sollest du UI und Logik trennen.
    - Verwende ein besseres 'Datenbanksystem'. Überlege dir z.B. pro Benutzer eine Datei zu verwenden, in welcher das gehashte Passwort und andere Daten wie das Registrierungsdatum etc. gespeichert sind.
    - Mach dich über Pufferüberläufen schlau. Du hast nämlich einen drin. Benutze strncy statt strcpy bzw strncat statt strcat, wenn du nicht weißt, ob der Zielpuffer auch groß genug ist. Für die beste Benutzbarkeit loht sich auch ein Buffer ohne Maximalgröße.
    - Setze dich nocheinmal mit Zeiger auseinander und wann man sie braucht.


  • Mod

    roflo schrieb:

    -> deklariere variablen da, wo du sie brauchst, nicht immer irgendwo ganz weit oben in einer funktion.

    Wenn man streng C89 macht, ist das leider nur am Blockanfang erlaubt. Man darf natürlich großzügig Blöcke im Code einfügen, wo immer man möchte.

    -> fclose für die erste datei wird bei einem fehler beim öffnen der zweiten nicht aufgerufen

    Hihi, das wird haarig, das mit Anfängermitteln in C schön umzusetzen.



  • Zerfleischen war doch nicht wörtlich gemeint liebster Wutz.
    Und wunderbar, dass du die Ironie in "Fehrbesserungsvorschläge" erkannt hast.

    Vielen Dank für die Beiträge,
    ich kann soweit alles nachvollziehen.
    Gerne auch noch weiteres!

    @SeppJ: Damit sollte es doch schon gegessen sein oder? (buffer ist auch gleich drin)

    if((UserPWSave = fopen(bufferUserPW, "w")) == NULL) {
    fprintf(stderr, "Erstellen des Kontos fehlgeschlagen.");
    fclose(UserNameSave);
    return 1;
    }


  • Mod

    MrSonak schrieb:

    if((UserPWSave = fopen(bufferUserPW, "w")) == NULL) {
    fprintf(stderr, "Erstellen des Kontos fehlgeschlagen.");
    fclose(UserNameSave);
    return 1;
    }

    In diesem Fall ja, aber jetzt für noch ein paar mallocs, sockets und ähnliches ein und das wird ganz schnell ganz ekelig, wenn du jeden Fall von Hand behandelst. Und automatische Behandlung ist in C nicht wirklich gut machbar.

    Ach ja: Wie man seinen Beitrag lesbar formatiert



  • roflo schrieb:

    Schrott

    Schon wieder einer der sich berufen fühlt, mit aufgeschnapptem Googlehalbwissen die Allgemeinheit zu beglücken und konkreten Code inkl. die Sprache selbst zu beurteilen und "Empfehlungen" abzugeben.

    roflo schrieb:

    Das Programm ist nicht unbedingt Schrott

    Das kannst du als Anfänger ebensowenig beurteilen wie der Frager.

    roflo schrieb:

    -> Die verwendung von zeigern ist hier nicht sinnvoll, du kannst auch gleich den entsprechenden buffer verwenden

    Du hast keine Ahnung, was Zeiger sind und demzufolge auch keine Ahnung, wovon du redest.

    roflo schrieb:

    -> deklariere variablen da, wo du sie brauchst, nicht immer irgendwo ganz weit oben in einer funktion.

    Du hast keine Ahnung, was eine Deklaration ist gibst aber trotzdem "Empfehlungen" für den Gebrauch.
    Du hast keine Ahnung von C, du hast keine Ahnung wovon du redest.

    roflo schrieb:

    -> strncpy statt strcpy, da sonst Bufferoverflowgefahr.

    strncpy statt strcpy zu empfehlen ist schlimmstes Pfuscher-JW Niveau, du weißt auch hier nicht wovon du redest, weil du keine Ahnung hast und einen extrem begrenzten Horizont nebst Auffassungsgabe.

    roflo schrieb:

    Ansonsten, hut ab, ich hab hier noch keinen Anfänger gesehen, der c-strings verstanden hat und const verwendet

    Du desavouierst dich selbst als blutigen Anfänger, merkst das aufgrund deines laienhaften Halbwissens nicht, offenbarst damit deine grenzenlose Naivität.

    @MrSonak
    Du kannst deinen Code noch nicht mal vernünftig formatieren, ebensowenig wie du die C-Codetags benutzen kannst.
    Du kannst davon ausgehen, dass ein Verriss für deinen Code mind. ebensolchen Umfang haben würde wie der o.g. für deinen Bruder im Geiste.
    Dein Versuch, nachträglich deine Legasthenie zu kaschieren, ist naiv und offenbart nochmals deinen grundsätzlich beschränkten Horizont und Auffassungsgabe.
    Suche dir ein anderes Hobby.


  • Mod

    Bleib mal ruhig, nach zwei Wochen darf ein Code auch mal nicht perfekt sein.



  • Ich habe meinen Beitrag nochmals überarbeitet, ich hoffe doch sehr, dass er jetzt weniger missverständlich ist 😉



  • @roflo:

    1,2,3: Erldegit.
    4: Werde mich mal dran machen das zu trennen. Das Programm hier ist ja nur der Baustein zur "Registrierung".
    5: Benutzername und Passwort werden jetzt schon in einem Dokument gespeichert. Das habe ich bereits geändert. Die Dateien werden jetzt chronlogogisch 0,1,2,3 usw. gespeichert.
    Das mit den weiteren Daten, z.B. Datum finde ich eine super Idee. Werde mal schauen was da nützlich wäre!
    6: fflush(); ist ja nicht auf allen Plattformen kompatibel, deswegen mist. Bei getchar(); hatte ich immer das Problem, dass man einmal extra Enter drücken muss.
    Wie wäre da eine korrekte und funktionale Lösung? Rest nehme ich so an.
    7: Mache ich, sind aber aufgrund des "Counters" der jetzt die Dateinamen bestimmt sowieso rausgeflogen.

    Vielen Dank! 🙂



  • Es wäre irgendwie anständig wenigstens zu bemerken, dass ein Reihe von Beiträgen gelöscht wurden.


  • Mod

    EOP schrieb:

    Es wäre irgendwie anständig wenigstens zu bemerken, dass ein Reihe von Beiträgen gelöscht wurden.

    Die gelöschten Beiträge waren eine Bemerkung nicht wert.



  • Mein Beitrag war ausnahmsweise OK.


  • Mod

    EOP schrieb:

    Mein Beitrag war ausnahmsweise OK.

    EOP schrieb:

    Wutz hatte wohl etwas schlechte Laune. Soll schon mal vorkommen.

    Das ist dieser bemerkenswerte Erguss, um den das Forum getrauert hätte, wenn er unbemerkt verschwunden wäre? Dann darfst du in diesem Beitrag als ein Denkmal für deinen Kommentar ansehen.



  • Im Verhältnis zu diversen anderen Ergüssen meinerseits war der Beitrag m.E. voll OK. 🙂

    ps:
    Hätte nicht gedacht, dass du die gelöschten Beiträge für dein Poesiealbum aufhebst.


  • Mod

    EOP schrieb:

    ps:
    Hätte nicht gedacht, dass du die gelöschten Beiträge für dein Poesiealbum aufhebst.

    Was denkst du denn, wie der Weihnachtsmann sonst herausfindet, wer frech und wer artig war? Das wird alles in deine permanente Akte eingetragen.



  • 3:36, 5:14, 10:01 - du schläfst wohl nie.



  • Huch was war denn mit mir gestern los 😮 Durch 10 Stunden Ritt quer über den Globus und Wutz Angriffe hat sich wohl übelster Mist zusammengebraut.....

    @Mrsonak: Bei der Eingabe kannst du weiter fgets mit einer festgelegten Maximalgrenze benutzen, andere Möglichkeiten sehe ich nicht. Ist auch per se nicht für Bufferoverflows anfällig. Deine eine konstruktionen mit strcat aber schon.
    fflush ist btw standard und für Ausgabeströme gut definiert.



  • roflo schrieb:

    Ist auch per se nicht für Bufferoverflows anfällig. Deine eine konstruktionen mit strcat aber schon.

    Dann zeig ihn mal in dem Fall, du Held des overflows.



  • Wtf, bin ich jetzt völlig durch den Wind?!

    char getUserName [20]; 
    char bufferUserName[24]; 
    char bufferUserPW[30] = {"PW"};
    
    strcpy(bufferUserName,getUserName); 
    strcat(bufferUserName,".txt");
    strcat(bufferUserPW, bufferUserName);
    

    Diese Zeilen haben mich wohl durch fehlenden Codetags und Kotzformatierung völlig aus der Bahn geworfen.
    Ich kann Wutz jetzt schon irgenwie verstehen.

    'tschuldigung, werd mich erstmal hinlegen und Tee trinken...


Anmelden zum Antworten