Datei nach Text durchsuchen und ein Wort ersetzen

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

  • Userkopie.txt
    91 Bytes · Aufrufe: 0
  • User.txt
    91 Bytes · Aufrufe: 0

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
 

Neue Beiträge