Login-Programm

Shunei

Grünschnabel
Ich schreibe derzeit ein Login-Programm und habe das Problem das ab ca. 3 angelegten Nutzern das Programm den String für die Passwort Wiederholung nihct richtig einliest und folgend irgendwann abstürzt. Ich verstehe nihct wieso Scanf() so probleme dabei macht. Da es aber erst nach einer bestimmten Anzahl an angelegten Benutzern für das Login passiert, gehe ich davon aus das es sich um ein Problem mit der Speicherverwaltung handelt. Wenn jemand mir da helfen könnte wäre das wirklich super !!
Lieben dank schonmal im vorraus!

Mein code für diese Funktion in der Problem entseht:

void Passwortanlegen( struct User *Data,int counter){

//Variable Initialisieren
int i=0;
int j=0;
int fail=0; //Variable zum erkennen Falscher eingabe
int sucess[3]={0,0,0};
char Letter=0; //Eingabe
char *Name=NULL; //Dynamischer Pointer
char *Passwort2=NULL; //Dynamischer Pointer für die Passwortwiederholung
Name=(char*) calloc(1,sizeof(char));
Passwort2=(char*) calloc(1,sizeof(char));

//Passwort kriterien
printf("\nGeben sie nun bitte ein Passwort nach folgenden Kriterien an\n");
printf("-8-14 Zeichen\n-min. einen Grossbuchstaben\n-min. einen Kleinbuchstaben\n-min. eine Dezimalzahl\n\n");
printf("Ihr Passwort:");

//Einlesen des Passworts
do{

scanf("%c", &Letter);

//Prüfen ob die Kriterien stimmen
if(33<=Letter&&Letter<=126){

if(48<=Letter&&Letter<=57){

sucess[0]++;

}else if(65<=Letter&&Letter<=90){

sucess[1]++;

}else if(97<=Letter&&Letter<=122){

sucess[2]++;

}

//Passwort ins Array schreiben
Name=Letter;
Name=(char*) realloc(Name, (i+1)*sizeof(char)); //Array vergrößern
i++;

}else if(Letter!='\n'&&Letter!=EOF){

fail++; //prüfen ob EOF oder '\n' mit eingelesen wurde

}

}
while(Letter!='\n'&&Letter!=EOF);

Name='\0';//string beenden



if((fail!=0&&(sucess[0]==0||sucess[1]==0||sucess[2]==0))||(i<8||i>14)){

//Falls das Passwort falsch eingeben wurde
free(Name); //speicher zurückgeben
printf("\nDas Passwort wurde fehlerhaft eingeben!\n"); //ausgabe über falsches Passwort
Passwortanlegen(Data, counter); //funktion wiederholen

}else{

//Den User das Passwort wiederholen lassen
do{
fflush(stdin);
printf("\nDas Passwort bitte wiederholen:");

do{

scanf("%c", &Letter);

if(33<=Letter&&Letter<=126){

// Passwort ins Array schreiben
Passwort2
=Letter;
Passwort2=(char*) realloc(Passwort2, (j+1)*sizeof(char));
j++;
}


}
while(Letter!='\n'&&Letter!=EOF);

Passwort2='\0';//string beenden


if(strcmp(Name, Passwort2)!=0){ //Passwörter vergleichen

//Falls Passwörter nicht übereinstimmen zurücksetzen
printf("Die Passwoerter stimmen nicht ueberein!");
free(Passwort2); //Speicher zurückgeben
Passwort2=NULL; //Pointer dynamisch erstellen
Passwort2=(char*) calloc(1,sizeof(char));
j=0; //zählvariable Zurücksetzen
}

}while(strcmp(Name, Passwort2)!=0);//strcmp(Name, Passwort2)!=0

Data[counter].Passw=(char*) calloc(j,sizeof(char)); //Speicher für Passwort in Struct reservieren
strcpy(Data[counter].Passw, Name); //Passwort in Struct kopieren
free(Name); //speicher zurückgeben
return 0;

}
}
 
Benutz Code-Tags
C:
void Passwortanlegen( struct User *Data,int counter){
//Variable Initialisieren
int i=0;
int j=0;
int fail=0; //Variable zum erkennen Falscher eingabe
int sucess[3]={0,0,0};
char Letter=0; //Eingabe
char *Name=NULL; //Dynamischer Pointer
char *Passwort2=NULL; //Dynamischer Pointer für die Passwortwiederholung
    Name=(char*) calloc(1,sizeof(char));
    Passwort2=(char*) calloc(1,sizeof(char));
    //Passwort kriterien
    printf("\nGeben sie nun bitte ein Passwort nach folgenden Kriterien an\n");
    printf("-8-14 Zeichen\n-min. einen Grossbuchstaben\n-min. einen Kleinbuchstaben\n-min. eine Dezimalzahl\n\n");
    printf("Ihr Passwort:");
    //Einlesen des Passworts
    do
        {scanf("%c", &Letter);//Prüfen ob die Kriterien stimmen
        if(33<=Letter&&Letter<=126)
            {if(48<=Letter&&Letter<=57)
                {sucess[0]++;}
            else if(65<=Letter&&Letter<=90)
                {sucess[1]++;}
            else if(97<=Letter&&Letter<=122)
                {sucess[2]++;}
            //Passwort ins Array schreiben
            Name=Letter;
            Name=(char*) realloc(Name, (i+1)*sizeof(char)); //Array vergrößern
            i++;}
        else if(Letter!='\n'&&Letter!=EOF)
            {fail++;}} //prüfen ob EOF oder '\n' mit eingelesen wurde
    while(Letter!='\n'&&Letter!=EOF);
    Name='\0';//string beenden
    if((fail!=0&&(sucess[0]==0||sucess[1]==0||sucess[2]==0))||(i<8||i>14))
        {
        //Falls das Passwort falsch eingeben wurde
        free(Name); //speicher zurückgeben
        printf("\nDas Passwort wurde fehlerhaft eingeben!\n"); //ausgabe über falsches Passwort
        Passwortanlegen(Data, counter);} //funktion wiederholen
    else
        {do  //Den User das Passwort wiederholen lassen
            {fflush(stdin);
            printf("\nDas Passwort bitte wiederholen:");
            do
                {scanf("%c", &Letter);
                if(33<=Letter&&Letter<=126)
                    {Passwort2=Letter; // Passwort ins Array schreiben
                    Passwort2=(char*) realloc(Passwort2, (j+1)*sizeof(char));
                    j++;}}
            while(Letter!='\n'&&Letter!=EOF);
            Passwort2='\0';//string beenden
            if(strcmp(Name, Passwort2)!=0) 
                //Passwörter vergleichen
                //Falls Passwörter nicht übereinstimmen zurücksetzen
                {printf("Die Passwoerter stimmen nicht ueberein!");
                free(Passwort2); //Speicher zurückgeben
                Passwort2=NULL; //Pointer dynamisch erstellen
                Passwort2=(char*) calloc(1,sizeof(char));
                j=0;}} //zählvariable Zurücksetzen            
        while(strcmp(Name, Passwort2)!=0);//strcmp(Name, Passwort2)!=0
        Data[counter].Passw=(char*) calloc(j,sizeof(char)); //Speicher für Passwort in Struct reservieren
        strcpy(Data[counter].Passw, Name); //Passwort in Struct kopieren
        free(Name); //speicher zurückgeben
        return 0;}
}
Finde den Fehler...... (und ich glaube den Fehler auch zu sehen)
 
Zurück