Datei nach Text durchsuchen und ein Wort ersetzen


Tyroun

Grünschnabel
Hallo,

ich hätte eine Frage und zwar, will ich in meinem Programm(in C geschrieben) eine Datei mit ID Username und Passwort, nach einem bestimmten Username durchsuchen und nur das Passwort ändern (quasi das alte Passwort mit dem neuen überschreiben).
Die Textdatei sieht so aus:

ID Username Passwort
1 Test Test123

Ich habe bis jetzt keine Lösung gefunden.
Könnte mir hierbei jemand helfen wie ich das realisieren kann?

Ich bedanke mich schonmal :)

Grüße
Tyroun
 

Yaslaw

n/a
Moderator
Kann kein C. Aber das schreit nach einem RegEx-Replace. Den gibts sicher auch in C

Code:
Pattern: ^(\d+\s+Test+\s+)\S+$
Replace: $1NeuesPasswort
Flags: Multiline
ggf ist bei c nit $1 sond \1 oder sonstwas.

Ps. Ich hoffe für dich, dass die Passwörter verschlüsselt sind....
 

Tyroun

Grünschnabel
Wo genau ist denn das Problem?
Und poste mal den relevanten Code!
VG Klaus
Hey,

also mein Problem genau ist ich weis nicht, wie ich ein wort in einer Datei überschreiben kann :)

C:
void Changepw(){            //Passwort des Users wird geändert
    char buff[255];
    unsigned char len;
    FILE * fp;
    fp = fopen("User.txt","r+");

    while(EOF != fgetc((FILE*)fp)){
          fscanf(fp,"%s",buff); //id
          fscanf(fp,"%s",buff);//benutzername
          len=strlen(userbuf.password);

          if(!strcmp(buff,userbuf.benutzername)){
            while(1){
                printf("Geben Sie bitte ein neues Passwort ein: ");
                fgets(userbuf.password,255,stdin);
                if(pwok()){
                    break;
                }
                printf("Passwort entspricht nicht den Anforderungen!\n");
            }
            //Hier sollte das alte passwort überschireben werden, was aber unter windows nicht funktioniert.
            fseek(fp,-len-1,SEEK_CUR);
            snprintf(buff,"%s%ds","%s%",len-4);
            fprintf(fp,buff,userbuf.password,"\n");

            break;
          }
    }
    fclose(fp);
Ich habe diesen Code für die Passwortänderung von einem Kumpel bekommen, aber der funktioniert nur auf Linux und nicht auf Windows, daher brauch ich eine andere Lösung.
ich arbeite auch mit structs also die ID, das Passwort und der Benutzername werden in folgendes struct geschrieben und dann in der Datei abgelegt mit folgender Funktion.

Code:
struct user{                    //struct für einen user definieren
    char benutzername[255];
    char password[255];
    char id[255];
}userbuf; 

void saveUser(){            //User wird in eine Datei geschrieben
    FILE * user;
    user = fopen("User.txt","a+");
    fprintf(user," %d %s %s",count,userbuf.benutzername,userbuf.password);
    fclose(user);
    setupcount();
}
Ich hoffe die Infos helfen weiter.
LG
 

Tyroun

Grünschnabel
Kann kein C. Aber das schreit nach einem RegEx-Replace. Den gibts sicher auch in C

Code:
Pattern: ^(\d+\s+Test+\s+)\S+$
Replace: $1NeuesPasswort
Flags: Multiline
ggf ist bei c nit $1 sond \1 oder sonstwas.

Ps. Ich hoffe für dich, dass die Passwörter verschlüsselt sind....
Danke für die Antwort ich werde das mal ausprobieren.
LG
 

Trulleberg

Mitglied
Solange immer genau 3 Worte in einer Zeile vorkommen, funktioniert Folgendes:
C:
int main()
{
  char s1[80], s2[80], s3[80], *b = calloc(1, 100000), *alt = "vorher", *neu = "nachher";
  FILE* f = fopen("User.txt", "r+");
  while (fscanf(f, "%s%s%s", s1, s2, s3) == 3)
  {
    strcat(b, s1); strcat(b, " "); strcat(b, s2); strcat(b, " ");
    if (strcmp(s3, alt)) strcat(b, s3); else strcat(b, neu);
    strcat(b, "\n");
  }
  rewind(f);
  fputs(b,f);
  fclose(f);
  free(b);
}
 
Zuletzt bearbeitet:

Tyroun

Grünschnabel
Hey,

danke für dir Antwort.
ich habe den Code mal eingefügt, aber dies funktioniert nicht und danach sagt mit das Programm das der Benutzername nicht existiert.
Hier ist mal der vollständige Code von mir, vielleicht hab ich es falsch eingefügt.

Code:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <time.h>
#include <windows.h>
#include <unistd.h>
#include <sys/stat.h>

void Login_or_Register(); //bekannt machen der Funktion Login_or_Register
void Registr();           //bekannt machen der Funktion Registr
void Login();             //bekannt machen der Funktion Login
void Changepw();          //bekannt machen der Funktion Changepw
bool usernameFree();      //bekannt machen der Funktion usernameFree
bool pwok();           //bekannt machen der Funktion pwbloed
void Menu();              //bekannt machen der Funktion Menu
void init();
bool laengekorrekt();
bool istsonderzeichen(char);
bool hatGrossbuschstabe();
bool hatSonderzeichen();
int count = 0;            //bekannt machen der Variable count


struct user{                    //struct für einen user definieren
    char benutzername[255];
    char password[255];
    char id[255];
}userbuf;                       //struct userbuf anlegen

struct bedingung{               //struct für das zwischenspeichern der Passwortbedingungen
    int laenge;
    char sonder[10];
    bool upchar;
}pwdbedingung;

unsigned char state = 1; //Variable für switch Statement

int main(){
    init();
    while(1){
        switch(state){                              //steuerung der Funktionsaufrufe
            case 1: Login_or_Register(); break;
            case 2: Registr(); break;
            case 3: Login(); break;
            case 4: Menu();break;
            case 5: Changepw(); break;

        }
    }
}

void Login_or_Register(){   //Funktion für das Auswählen von anmelden oder registrieren
    char a[1];
    printf("a for Login or r for register \n");
    while(1){
        fgets(a,16,stdin);
        if(a[0] == 'a'){
            state = 3; break;
        }else if(a[0] == 'r'){
            state = 2; break;
        }
        printf("Nicht korrekte Eingabe");
    }
}

void Registr(){             //Registriervorgang
    while(1){
        printf("Benutername: ");
        fgets(userbuf.benutzername,255,stdin);
        userbuf.benutzername[strlen(userbuf.benutzername)-1] = 0;
        if(usernameFree()){     //ruft die Funktion userFree auf, um zu Prüfen ob es den Username schon gibt
            break;
        }
        printf("username already exists \n");
    }

        while(1){
            printf("Passwort: ");
            fgets(userbuf.password,255,stdin);


            if(pwok()){
                printf("Sie haben sich Registriert\n");
                break;
            }
            printf("Passwort entspricht nicht den Vorgaben\n");
        }
    state = 3;
    saveUser();         //speichert den User in eine Datei
}

bool laengekorrekt(){       //Überprüft ob die Länge des Passwortes den Vorgaben entspricht

    return strlen(userbuf.password) >= pwdbedingung.laenge;

}
bool hatSonderzeichen(){    //Überprüft ob das Passwort eines der Vorgegebenen Sonderzeichen hat
    for(int i = 0; i < strlen(userbuf.password);i++){
        if(istsonderzeichen(userbuf.password[i])){
            return 1; //wenn eins vorkommt bricht return die for schleife ab
        }

    }
    return 0;

}
bool hatGrossbuschstabe(){  //Überprüft ob das Passwort ein Großbuchstaben hat
    for(int i = 0; i < strlen(userbuf.password);i++){
        if(userbuf.password[i] >= 'A' && userbuf.password[i] <= 'Z'){
            return 1;
        }
    }
    return 0;
}
bool istsonderzeichen(char s){      //Geht jedes Zeichen des Passworts durch und schaut ob es eines der Vorgegebenen Sonderzeichen ist
    unsigned char c;
    for(c=0; c<strlen(pwdbedingung.sonder);c++){
       return pwdbedingung.sonder[c] == s;
    }
    return 0;
}
bool usualPw(){             //Überprüft ob es eines der angegebenen Standardpasswörter ist
    char buff[255];
    FILE * fp;
    fp = fopen("cirt-defauld-passwords.txt","r");

    while(EOF != fgetc((FILE*)fp)){
        fscanf(fp,"%s",buff);
        if(!strcmp(buff,userbuf.password)){
            fclose(fp);
            return 1;
        }
    }
    fclose(fp);
    return 0;
}
bool pwok(){                //gibt zurück ob das Passwort den Anforderungen entspricht
   return laengekorrekt()
    &&hatSonderzeichen()
    &&hatGrossbuschstabe()
    &&!usualPw();
}
bool usernameFree(){        //Überprüft ob es den Usernamen schon gibt
    char buff[255];
    FILE * fp;
    fp = fopen("User.txt","r");

    while(EOF != fgetc((FILE*)fp)){
        fscanf(fp,"%s",buff);
        fscanf(fp,"%s",buff);
        if(!strcmp(buff,userbuf.benutzername)){
            fclose(fp);
            return 0;
        }
        fscanf(fp,"%s",buff);
    }
    fclose(fp);
    return 1;


}
bool passwortCorrect(){
        char buff[255];
        FILE * fp;
        fp = fopen("User.txt","r");

        while(EOF != fgetc((FILE*)fp)){
        fscanf(fp,"%s",userbuf.id);
        fscanf(fp,"%s",buff);
        if(!strcmp(buff,userbuf.benutzername)){
            fscanf(fp,"%s",buff);
            fclose(fp);
            return !strcmp(buff,userbuf.password);
        }
        fscanf(fp,"%s",buff);
    }
    fclose(fp);
    return 0;

}
void log(){                 //Schreibt in eine Datei wann sich ein User angemeldet hat
    FILE * fp;
    fp = fopen("log.txt","a+");
    time_t current_time;
    char* c_time_string;
    current_time = (unsigned long)time(NULL);
    c_time_string = ctime(&current_time);
    c_time_string[strlen(c_time_string)-1]=0;
    fprintf(fp,"der User: %s mit der ID: %s hat sich zum Zeitpunkt: %s angemeldet\n ",userbuf.benutzername,userbuf.id,c_time_string);
    fclose(fp);

}
void Login(){               //Loginvorgang
    while(1){
        printf("Benutzername: ");
        fgets(userbuf.benutzername,255,stdin);
        userbuf.benutzername[strlen(userbuf.benutzername)-1]=0;
        if(usernameFree()){
            printf("Benutzer existiert nicht\n");
            continue;
        }
        break;
    }
    for(int f = 2; f >= 0;f--){
        printf("Passwort: ");
        fgets(userbuf.password,255,stdin);
        userbuf.password[strlen(userbuf.password)-1]=0;
        if(passwortCorrect()){
            printf("Sie sind eingeloggt!\n");
            break;
        }
        printf("Passwort falsch , sie haben noch %i Versuche.\n",f);
        if(!f){
            Sleep(15000);
            return ;
        }
    }
    checkMark();
    log();
    state = 4;
}
void checkMark(){           //überprüft ob der User auf der Liste mit veralteten Passwörtern steht
    char buff[255];
    FILE * fp;
    fp = fopen("uptodatepw.txt","r");

    while(!feof(fp)){
        fscanf(fp,"%s",buff);
        if(!strcmp(buff,userbuf.benutzername)){
            printf("Ihr Passwort entspricht nicht den aktuellen Vorgaben!\n");
            Changepw();
            break;
        }
    }
    fclose(fp);
}
void Changepw(){            //Passwort des Users wird geändert
      char s1[80], s2[80], s3[80], *b = calloc(1, 100000), *alt = "vorher", *neu = "nachher";
  FILE* f = fopen("User.txt", "r+");
  while (fscanf(f, "%s%s%s", s1, s2, s3) == 3)
  {
    strcat(b, s1); strcat(b, " "); strcat(b, s2); strcat(b, " ");
    if (strcmp(s3, alt)) strcat(b, s3); else strcat(b, neu);
    strcat(b, "\n");
  }
  rewind(f);
  fprintf(f, "%s", b);
  fclose(f);
  free(b);
  return 0;
}
void Menu(){                //das Menü wird aufgerufen

}
void saveUser(){            //User wird in eine Datei geschrieben
    FILE * user;
    user = fopen("User.txt","a+");
    fprintf(user," %d %s %s",count,userbuf.benutzername,userbuf.password);
    fclose(user);
    setupcount();
}
void setupcount(){          //Zähler wird hochgesetzt(für die ID)
    count++;

    FILE * fp;
    fp = fopen("usercount.txt","w");
    fprintf(fp,"%i",count);
    fclose(fp);
}
void init(){                //Passwortbedingungen werden eingelesen und in den struct gespeichert
    char buff[255];
    FILE * fp;
    fp = fopen("pwd-specification.txt","r");

    fscanf(fp,"%s",buff);
    fscanf(fp,"%s",buff);//min-length
    pwdbedingung.laenge = atoi(buff);

    fscanf(fp,"%s",buff);
    fscanf(fp,"%s",buff);//charset
    strcpy(pwdbedingung.sonder,buff);

    fscanf(fp,"%s",buff);
    fscanf(fp,"%s",buff);//upchar
    pwdbedingung.upchar = strcmp(buff,"false");
    fclose(fp);

    fp = fopen("usercount.txt","r");

    fscanf(fp,"%s",buff);
    count=atoi(buff);
    fclose(fp);

    struct stat stats;
    stat("pwd-specification.txt",&stats);

    struct tm dt;

    char timeString[20];
    dt = *(gmtime(&stats.st_mtime));
    snprintf(timeString, 20, "%04d-%02d-%02d %02d:%02d:%02d",dt.tm_year + 1900, dt.tm_mon+1,dt.tm_mday,
    dt.tm_hour, dt.tm_min, dt.tm_sec);

    fp = fopen("logaenderung.txt","r");

    fscanf(fp,"%s",buff);
    fclose(fp);

    fp = fopen("logaenderung.txt","w");
    if(strcmp(timeString,buff)){
        fprintf(fp,"%s",timeString);
        checkUpdatePw();
    }
    fclose(fp);

}
void markUser(){            //schreibt die User zum überprüfen in eine Datei bei denen die Passwortvorgaben nicht mehr mit dem Passwort übereinstimmen
    FILE * fp;
    fp = fopen("uptodatepw.txt","a+");
    fprintf(fp,"%s\n",userbuf.benutzername);
    fclose(fp);
}
void checkUpdatePw(){       //liest die User mit veralteten Passwort ein

    remove("uptodatepw.txt");
    char buff[255];

    FILE * fp;
    fp = fopen("User.txt","r");

    while(EOF != fgetc((FILE*)fp)){
        fscanf(fp,"%s",userbuf.id);
        fscanf(fp,"%s",userbuf.benutzername);
        fscanf(fp,"%s",userbuf.password);

        if(!pwok()){
            markUser();
        }
    }

}
Und im Anhang auf mal die User Datei die nach dem Benutzer durchsucht werden soll und das Passwort ersetzt werden soll.

Sorry, dass ich mich Wahrscheinlich echt dumm anstelle :(
 

Anhänge

Tyroun

Grünschnabel
Solange immer genau 3 Worte in einer Zeile vorkommen, funktioniert Folgendes:
C:
int main()
{
  char s1[80], s2[80], s3[80], *b = calloc(1, 100000), *alt = "vorher", *neu = "nachher";
  FILE* f = fopen("User.txt", "r+");
  while (fscanf(f, "%s%s%s", s1, s2, s3) == 3)
  {
    strcat(b, s1); strcat(b, " "); strcat(b, s2); strcat(b, " ");
    if (strcmp(s3, alt)) strcat(b, s3); else strcat(b, neu);
    strcat(b, "\n");
  }
  rewind(f);
  fputs(b,f);
  fclose(f);
  free(b);
}
Hey,

ich habe oben nochmal meinen kompletten Code Gepostet, weil es irgendwie nicht geklappt hat, vielleicht hab ich da was falsch gemacht. Könntest du mir vielleicht nochmal helfen? :)
LG
 

Trulleberg

Mitglied
Sinn und Zweck von Funktionen ist es NICHT, sie ohne Parameter zu gebrauchen wie du es durchgehend machst!
C:
void Changepw() {            //Passwort des Users wird geändert
  char s1[255], s2[255], s3[255], *b = calloc(1, 100000);
  FILE* f = fopen("User.txt", "r");
  while (fscanf(f, "%s%s%s", s1, s2, s3) == 3)
  {
    if (!strcmp(s2, userbuf.benutzername))
    {
      while (1) {
        printf("Geben Sie bitte ein neues Passwort ein: ");
        fgets(userbuf.password, 255, stdin);
        userbuf.password[strlen(userbuf.password) - 1] = 0;
        if (pwok()) {
          break;
        }
        puts("Passwort entspricht nicht den Anforderungen!");
      }
      strcpy(s3, userbuf.password);
    }
    strcat(b, s1); strcat(b, " "); strcat(b, s2); strcat(b, " "); strcat(b, s3); strcat(b, "\n");
  }
  fclose(f); f = fopen("User.txt", "w"); fputs(b, f); fclose(f);
  free(b);
}
 

Tyroun

Grünschnabel
Sinn und Zweck von Funktionen ist es NICHT, sie ohne Parameter zu gebrauchen wie du es durchgehend machst!
C:
void Changepw() {            //Passwort des Users wird geändert
  char s1[255], s2[255], s3[255], *b = calloc(1, 100000);
  FILE* f = fopen("User.txt", "r");
  while (fscanf(f, "%s%s%s", s1, s2, s3) == 3)
  {
    if (!strcmp(s2, userbuf.benutzername))
    {
      while (1) {
        printf("Geben Sie bitte ein neues Passwort ein: ");
        fgets(userbuf.password, 255, stdin);
        userbuf.password[strlen(userbuf.password) - 1] = 0;
        if (pwok()) {
          break;
        }
        puts("Passwort entspricht nicht den Anforderungen!");
      }
      strcpy(s3, userbuf.password);
    }
    strcat(b, s1); strcat(b, " "); strcat(b, s2); strcat(b, " "); strcat(b, s3); strcat(b, "\n");
  }
  fclose(f); f = fopen("User.txt", "w"); fputs(b, f); fclose(f);
  free(b);
}
Perferkt vielen vielen Dank.
Es funktioniert :)

LG
 

Tyroun

Grünschnabel
Sinn und Zweck von Funktionen ist es NICHT, sie ohne Parameter zu gebrauchen wie du es durchgehend machst!
C:
void Changepw() {            //Passwort des Users wird geändert
  char s1[255], s2[255], s3[255], *b = calloc(1, 100000);
  FILE* f = fopen("User.txt", "r");
  while (fscanf(f, "%s%s%s", s1, s2, s3) == 3)
  {
    if (!strcmp(s2, userbuf.benutzername))
    {
      while (1) {
        printf("Geben Sie bitte ein neues Passwort ein: ");
        fgets(userbuf.password, 255, stdin);
        userbuf.password[strlen(userbuf.password) - 1] = 0;
        if (pwok()) {
          break;
        }
        puts("Passwort entspricht nicht den Anforderungen!");
      }
      strcpy(s3, userbuf.password);
    }
    strcat(b, s1); strcat(b, " "); strcat(b, s2); strcat(b, " "); strcat(b, s3); strcat(b, "\n");
  }
  fclose(f); f = fopen("User.txt", "w"); fputs(b, f); fclose(f);
  free(b);
}
Hey,

nochmal eine kurze Frage, das Ändern des Passwortes funktioniert zwar, aber jetzt funktioniert seit dem die Funktion drin ist nicht mehr die Überprüfung des Passwortes am Anfang heist wenn das Passwort mindestens 9 Zeichen lang sein soll und ich gebe z.B 8 Zeichen nur ein wird der user trotzdem Registriert. Und ebenfalls geht es mit dem anmelden nicht mehr richtig vielleicht einmal beim Start aber danach sagt das Programm immer Benutzername existiert nicht :(
Hast du da eine Idee woran das liegen könnte?

LG
 

ComFreek

Mod | @comfreek
Moderator
userbuf.password[strlen(userbuf.password) - 1] = 0;
Ich dachte fgets macht Nulltermination sowieso.

fscanf(f, "%s%s%s", s1, s2, s3)
[...]
strcat(b, s1); strcat(b, " "); strcat(b, s2); strcat(b, " "); strcat(b, s3); strcat(b, "\n");
Warnung: Beide Vorgehen erlauben Bufferoverflowangriffe, wenn man mal davon absieht, dass das der Prozess des Programms wahrscheinlich auch einfach "undefined behavior" haben wird, wenn ein solcher Bufferoverflow auftritt.
Kurzum: ich würde dringend abraten diesen Code zu nutzen.

Aber das schreit nach einem RegEx-Replace. Den gibts sicher auch in C
Leider nein :) C ist sehr low-level. Aber sicher als Bibliothek irgendwo.

Ein alternativer Ansatz wäre:
  • Lies die Datei Zeichen für Zeichen (als gedankliche Zustandsmaschine) ein
  • Solange der gesuchte Nutzername nicht vorkommt, schreibst du jedes Zeichen in eine andere Datei wieder raus.
  • Wenn der Nutzername vorkommt, schreibst du den Nutzernamen und das neue Password in die andere Datei raus.
  • Danach gehst du in einen Kopiermodus über und kopierst blind einfach jedes Zeichen.
 

Tyroun

Grünschnabel
Ich dachte fgets macht Nulltermination sowieso.


Warnung: Beide Vorgehen erlauben Bufferoverflowangriffe, wenn man mal davon absieht, dass das der Prozess des Programms wahrscheinlich auch einfach "undefined behavior" haben wird, wenn ein solcher Bufferoverflow auftritt.
Kurzum: ich würde dringend abraten diesen Code zu nutzen.


Leider nein :) C ist sehr low-level. Aber sicher als Bibliothek irgendwo.

Ein alternativer Ansatz wäre:
  • Lies die Datei Zeichen für Zeichen (als gedankliche Zustandsmaschine) ein
  • Solange der gesuchte Nutzername nicht vorkommt, schreibst du jedes Zeichen in eine andere Datei wieder raus.
  • Wenn der Nutzername vorkommt, schreibst du den Nutzernamen und das neue Password in die andere Datei raus.
  • Danach gehst du in einen Kopiermodus über und kopierst blind einfach jedes Zeichen.
Hey,

vielen dank für die Idee. Ich habe es mit dem vorgeschlagenen Ansatz hinbekommen :)

LG
 

Tyroun

Grünschnabel
Ich dachte fgets macht Nulltermination sowieso.


Warnung: Beide Vorgehen erlauben Bufferoverflowangriffe, wenn man mal davon absieht, dass das der Prozess des Programms wahrscheinlich auch einfach "undefined behavior" haben wird, wenn ein solcher Bufferoverflow auftritt.
Kurzum: ich würde dringend abraten diesen Code zu nutzen.


Leider nein :) C ist sehr low-level. Aber sicher als Bibliothek irgendwo.

Ein alternativer Ansatz wäre:
  • Lies die Datei Zeichen für Zeichen (als gedankliche Zustandsmaschine) ein
  • Solange der gesuchte Nutzername nicht vorkommt, schreibst du jedes Zeichen in eine andere Datei wieder raus.
  • Wenn der Nutzername vorkommt, schreibst du den Nutzernamen und das neue Password in die andere Datei raus.
  • Danach gehst du in einen Kopiermodus über und kopierst blind einfach jedes Zeichen.
Hey ich bin es nochmal :)

Also wie gesagt das mit dem Kopieren funktioniert, bis auf eine Sache und zwar wenn ich den ersten Benutzer ändere passt noch alles, aber sofern ich den Zweiten Benutzer ändern will wird mir die Letzte Zeile in meine Kopie reingeschrieben und dann steht die letzte Zeile immer Doppelt in der Datei. Und wenn ich den dritten Benutzer ändere fragt mich zb das Programm 2 mal nach dem neuen Passwort. Ich hab jetzt bisschen rumprobiert aber keine Lösung gefunden hast du da eine Idee? :)
anbei mein Code und die Dateien :)

C:
void Changepw(){            //Passwort des Users wird geändert
    char buffname[255];
    char buffpw[255];
    char buffid[255];
    int c;

    FILE * fp;
    FILE * dp;
    fp = fopen("User.txt","r+");
    dp = fopen("Userkopie.txt","w");
    while(!feof(fp)){
          fscanf(fp,"%s",buffid); //id
          fscanf(fp,"%s",buffname);//benutzername
          fscanf(fp,"%s",buffpw);//Passwort

          if(strcmp(buffname,userbuf.benutzername)){
            fprintf(dp," %s %s %s\n",buffid,buffname,buffpw);

          }

          if(!strcmp(buffname,userbuf.benutzername)){
            while(1){
                printf("Geben Sie bitte ein neues Passwort ein: ");
                fgets(userbuf.password,255,stdin);
                if(pwok() && buffname != userbuf.benutzername){
                    fprintf(dp," %s %s %s",buffid,buffname,userbuf.password);
                    break;
                }
                printf("Passwort entspricht nicht den Vorgaben!\n");
            }
          }
    }

fclose(fp);
fclose(dp);
CopyFileA("Userkopie.txt","User.txt",false);
}
LG
 

Anhänge

Tyroun

Grünschnabel
Das hier erlaubt immer noch Bufferoverflows!
Hey,

vielen dank schonmal für die Antwort.
Ich habe jetzt versucht zu verhindern, dass es Bufferoverflows machbar sind, aber ich habe nix gefunden, wie ich das verhindern kann.
Da ich mit Code Blocks programmiere geht irgendwie das fscanf_s nicht welches ja eigentlich die sicherere Variante ist. Auch das %50s z.B hat nicht geholfen. Das Problem besteht weiter, dass ab dem 2 User der letzte immer doppelt geschrieben wird.
Hast du nochmal ein Tipp für mich oder kannst du mir sagen wie ich das Problem lösen kann? :)
LG