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
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;
}
}
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;
}
}