String will nicht korrekt ausgelesen werden...

Ich weiß ähnliche Fragen existieren derzeit schon, aber keine davon hat mir weitergeholfen...

Also, mein Problem: Ich habe ein Programm geschrieben, welches erst überprüfen soll, ob "Nutzerdaten" vorhanden sind (natürlich keine richtigen). Wenn diese nicht vorhanden sind wird gefragt, ob welche erstellt werden sollen und dann wird man aufgefordert Nutzername und Passwort einzugeben. Naja, so weit so gut. Bis dahin funktioniert auch alles...

Wenn aber die Datei schon vorhanden ist, soll mein Programm den Nutzernamen ausgeben, allerdings gibt er mir nur "char" aus.

C++:
#include <stdio.h>
#include <string.h>
#include <windows.h>

char nutzername[32];
char pweingabe1[16];
char pweingabe2[16];
char pw[16];
char ufabfrage = 0;
char moeglichezeichen [62] = "0123465798abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

FILE *user;

int main()
{
    user = fopen("user.files", "rw");
   
    if(user == NULL) {
                printf("Es wurden keine Nutzerdaten gefunden.\nSollen jetzt Nutzerdaten angelegt werden? [Y/N]\n");
                scanf("%c", &ufabfrage);
                            if(ufabfrage != 'y' && ufabfrage != 'Y') {
                                         system("cls");
                                         printf("Es werden keine neuen Nutzerdaten angelegt.\n");
                                         system("PAUSE");
                                         return 0;
                            } else {
                                         system("cls");
                                         printf("Es werden neue Nutzerdaten angelegt.\n\nBitte geben Sie Ihren Nutzernamen (Max. 32 Zeichen, Zahlen von 0-9, Zeichen von a-z bzw. A-Z): ");
                                         scanf("%s", &nutzername);
                                         
                                         int len = strspn(nutzername, moeglichezeichen);
                                         
                                         if(len > 32) {
                                                printf("Nutzername enthält mehr als 32 Zeichen.\nBitte starte das Programm neu um dich erneut anzumelden.\n");
                                                Beep(3000, 100);
                                                sleep(3);
                                                Beep(3000, 100);
                                                system("PAUSE");
                                                return 0;
                                         }
                                         
                                         printf("\nBitte geben Sie Ihr Passwort ein (Max. 32 Zeichen, Zahlen von 0-9, Zeichen von a-z bzw. A-Z): ");
                                         scanf("%s", &pweingabe1);
                                         printf("\nWiederholen Sie Ihr Passwort: ");
                                         scanf("%s", &pweingabe2);
                                         
                                         int len1 = strspn(pweingabe1, moeglichezeichen);
                                         
                                         if(strcmp(pweingabe1, pweingabe2) != 0 || len1 > 32) {
                                                               printf("Die Passwörter stimmen nicht überein oder das eingegebene Passwort ist zu lang.\n");
                                                               Beep(3000, 100);
                                                               sleep(3);
                                                               Beep(3000, 100);
                                                               system("PAUSE");
                                                               return 0;
                                         } else {
                                                               system("cls");
                                                               printf("Nutzerdaten wurden erfolgreich angelegt!\n\nNutzername: %s\nPasswort: %s\n\n", nutzername, pweingabe1);
                                                               user = fopen("user.files", "a");
                                                               fprintf(user, "char nutzername [%d] = \"%s\" ; char pw[%d] = \"%s\" ;", len, nutzername, len1, pweingabe1);
                                                               fclose(user);
                                                               system("PAUSE");
                                         }
                }
    } else {
                user = fopen("user.files", "r");
                fscanf(user, "%s", &nutzername);
                fclose(user);
               
                printf("Es wurden Nutzerdaten gefunden!\nNutzername: %s\n", nutzername);
               
                system("PAUSE");
                return 0;
    }
}

Fehlermeldungen werden mir NICHT angezeigt und bis auf die Tatsache, dass das Programm nicht das ausgibt was ich vorgesehen habe funktioniert es einwandfrei.

Ich benutze Dev-C++ auf Windows und keine Grafischen Oberflächen (was man glaube ich auch erkennen kann^^)
 
Hi

also ab Zeile 68 der Teil?
scanf/fscanf mit %s ist zumindest problematisch, und & bei (f)scanf für Strings ist immer falsch.
Verwende
C++:
fgets(nutzername, 32, stdin);
wobei 32 die Länge von nutzername ist.

ein paar andere Tips und Probleme:

"rw" bei fopen gibts nicht.

Globale Variablen sind schlecht, aus einigen verschiedenen Gründen. Du hast sowieso nur ein main (und sonst keine Funktionen), also können die Variablen genausogut im main gemacht werden (ohne dass man irgendwas sonst ändern muss)

system("PAUSE"); ist auch schlecht.
 
Ich habs jetzt so abgeändert, wie ich das verstanden wie du das meinst und jetzt geht nix mehr
C++:
#include <stdio.h>
#include <string.h>
#include <windows.h>

int main()
{
  
char nutzername[32];
char pweingabe1[16];
char pweingabe2[16];
char pw[16];
char ufabfrage = 0;
char moeglichezeichen [62] = "0123465798abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

FILE *user;
  
    user = fopen("user.files", "w");
  
    if(user == NULL) {
                printf("Es wurden keine Nutzerdaten gefunden.\nSollen jetzt Nutzerdaten angelegt werden? [Y/N]\n");
                scanf("%c", &ufabfrage);
                            if(ufabfrage != 'y' && ufabfrage != 'Y') {
                                         system("cls");
                                         printf("Es werden keine neuen Nutzerdaten angelegt.\n");
                                         system("PAUSE");
                                         return 0;
                            } else {
                                         system("cls");
                                         printf("Es werden neue Nutzerdaten angelegt.\n\nBitte geben Sie Ihren Nutzernamen (Max. 32 Zeichen, Zahlen von 0-9, Zeichen von a-z bzw. A-Z): ");
                                         scanf("%s", &nutzername);
                                        
                                         int len = strspn(nutzername, moeglichezeichen);
                                        
                                         if(len > 32) {
                                                printf("Nutzername enthält mehr als 32 Zeichen.\nBitte starte das Programm neu um dich erneut anzumelden.\n");
                                                Beep(3000, 100);
                                                sleep(3);
                                                Beep(3000, 100);
                                                system("PAUSE");
                                                return 0;
                                         }
                                        
                                         printf("\nBitte geben Sie Ihr Passwort ein (Max. 32 Zeichen, Zahlen von 0-9, Zeichen von a-z bzw. A-Z): ");
                                         scanf("%s", &pweingabe1);
                                         printf("\nWiederholen Sie Ihr Passwort: ");
                                         scanf("%s", &pweingabe2);
                                        
                                         int len1 = strspn(pweingabe1, moeglichezeichen);
                                        
                                         if(strcmp(pweingabe1, pweingabe2) != 0 || len1 > 32) {
                                                               printf("Die Passwörter stimmen nicht überein oder das eingegebene Passwort ist zu lang.\n");
                                                               Beep(3000, 100);
                                                               sleep(3);
                                                               Beep(3000, 100);
                                                               system("PAUSE");
                                                               return 0;
                                         } else {
                                                               system("cls");
                                                               printf("Nutzerdaten wurden erfolgreich angelegt!\n\nNutzername: %s\nPasswort: %s\n\n", nutzername, pweingabe1);
                                                               user = fopen("user.files", "a");
                                                               fprintf(user, "nutzername = \"%s\" ; pw = \"%s\" ; ", len, nutzername, len1, pweingabe1);
                                                               fclose(user);
                                                               system("PAUSE");
                                         }
                }
    } else {
                user = fopen("user.files", "r");
                fgets(nutzername, 32, stdin);
                fclose(user);
              
                printf("Es wurden Nutzerdaten gefunden!\nNutzername: %s\n", nutzername);
              
                system("PAUSE");
                return 0;
    }
}

Und das mit system("PAUSE"); ich kenn sonst keine vernünftige alternative außer getchar(); aber damit schließt sich das Programm wieder sofort
 
Ups, hab mich oben vertan: Statt dem "stdin" gehört "user" hin...

Und bei getchar sollte sich das Programm eben nicht gleich schließen...
wie hast du es denn eingebaut?
 
Soo ich denke ich habe es jetzt verstanden^^ Allerdings gibt er mir statt des Nutzernamens den gesamten gespeicherten String aus, also wenn ich das mit erstellten Nutzerdaten starte, steht das im Anhang.
 

Anhänge

  • Unbenannt.png
    Unbenannt.png
    630 Bytes · Aufrufe: 20
Zuletzt bearbeitet:
Moin,

ich denke mal, dass dieser Part gemeint ist:
C++:
user = fopen("user.files", "r");
fgets(nutzername, 32, stdin);
fclose(user);
printf("Es wurden Nutzerdaten gefunden!\nNutzername: %s\n", nutzername);
Allerdings gibt er mir statt des Nutzernamens den gesamten gespeicherten String aus
Es werden maximal 32 Zeilen aus der Datei "user.files" ausgegeben !
Was steht denn dort konkret drin??

Gruß Klaus
 
@vfl_freak
Es werden maximal 32 Zeilen aus der Datei "user.files" ausgegeben !
Was steht denn dort konkret drin?
Wohl ein Vertipper, dennoch, um niemanden zu verwirren: Es werden maximal 32 Zeichen gelesen, und das nicht aus der Datei "user.files", sondern aus der stdin. Hier wird nur die Eingabe gelesen, daher kann das nicht der aktuelle Code sein.

Gruss
cwriter
 
so isses!
Mea maxima culpa :eek:

Ich denke schon dass es die Stelle ist ... wenn ich mir so den Anhang aus #5 anschaue .....
EDIT: aber stdin hast Du recht ... 'user' wird gar nicht verwendet

Gruß Klaus
 

Neue Beiträge

Zurück