Segmentation fault

So kann das nicht gehen.

Du machst ein int x und weist ihm am Anfang noch keinen Wert zu.
Dann steht irgendwas nicht voraussehbares drin, zB -887321283

Und nur wenn zufällig 0 drinsteht (was in ca 99.99999999% nicht sein wird), wird der Nachname eingelesen.
Das Gleiche für 2,3,4 mit Vorname etc.

Wozu sind überhaupt die Ganze ifs?
Alle if, alle x++, das int x und überhaupt alles mit x weg, dann ists gut.
 
Code:
void eingabe(Mitglied *personen){
	
	
	
	
	
	printf("Geben Sie den Nachnamen des neuen Mitglieds ein\n");
	 fgets(personen->nachname, 50, stdin);
	
	
	
	printf("Geben Sie den Vornamen des neuen Mitglieds ein\n");
	fgets(personen->vorname, 50, stdin);
	
	

	
	printf("Geben Sie die Mitgliedsnr des neuen Mitglieds ein\n");
		fgets(personen->mitgliedsnr, 50, stdin);
	
	
	
	printf("Geben Sie die Telefonnr des neuen Mitglieds ein\n");
    fgets(personen->telefonnr, 50, stdin);
	
	
	
}


Entschuldigung vllt. war ich etwas undeutlich.

So Sieht die Konsole aus:

(1)Ausgabe eines vorhandenen Eintrags
(2)Eingabe eines neuen Eintrages
(0)Ende des programms
Eingabe: 2
Geben Sie den Nachnamen des neuen Mitglieds ein
Geben Sie den Vornamen des neuen Mitglieds ein


Den Vornamen,Mitgliednr. , telnr, kann ich eingeben, den Nachnamen jedoch nicht. Ich erkenne nicht weshalb. Das ist das Problem.
 
Hi.

Das Problem ist, dass du folgende Sequenz im Programm hast:
C:
scanf("%d", &menu);
...
fgets(personen->nachname, ...)
Du könntest jetzt einfach in einer Zeile eingeben:
Code:
2Meier-Schulze-Hohmann
Das würde funktionieren.

Du aber gibst ein "2" "ENTER". Das führt dazu, dass "2\n" in der Eingabe steht. Die 2 liest du in menu ein und dann kommt fgets, womit du dann nur eine leere Zeile einliest.

Wenn du zeilenweise arbeiten willst, dann lies auch die Eingabe für die Menüauswahl mit fgets ein und verwende dann statt scanf einfach sscanf auf dem String.

Gruß
 
Ach, wieder mal dieses gemeine scanf :mad:
Das hat leider manchmal solche Problemchen...

Im main verwendest du ja zum Einlesen, was der Benutzer machen will, ein scanf.
Das liest solange ein, bis du einmal Enter drückst.
Jeder deiner Tastendrücker kommt zuerst in einen Tastaturbuffer(/Zwischenspeicher) und wird dann von dort von scnaf abgeholt.

Aus ungeklärten Grunden lässt es aber manchmal das abschließende Enter drin (im Tastaturbuffer.
Es hört zwar durchd as Enter zu lesen auf, entfernt das Enter aber nicht.

das fgets für den Nachnamen ist dann die nächste Funktion, die den Tastaturbuffer braucht.
Das Enter ist noch drin.
fgets liest es ein; denkt dass der Benutzer schon Enter gedrückt hat und hört sofort wieder auf zum Lesen.
Wenigstens entfernt es das Enter aus dem Tastaturbuffer.

Dann kommt das fgets für den Vornamen, das findet nicht sofort ein Enter und wartet deshalb wieder ordentlich auf eine Eingabe.

So, genug Erklärung.

Zum Problemlösen könntest du zB:
Die Zahl auch zuerst als String mit fgets einlesen
und dann mit sscanf in ein int "umwandeln".

sscanf ist wie scanf, liest aber nicht von der Tastatur sondern aus einem String.

C++:
    int menu;
    char menustring[10];
    
    printf("Willkommen im Mitgliedsverzeichnis\n");
    printf("------------------------------------\n");
    printf("Aus Gruenden des Datenschutzes werden\nkeine Eintraege dauerhaft gespeichert.\n");
    printf("------------------------------------\n");
    printf("(1)Ausgabe eines vorhandenen Eintrags\n");
    printf("(2)Eingabe eines neuen Eintrages\n");
    printf("(0)Ende des programms\n");
    printf("Eingabe: ");
    fgets(menustring,10,stdin);
    sscanf(menustring,"%d",&menu);

Gruß
 
Noch eine Kurze frage.

Code:
void eingabe(Mitglied *personen){
	
	Mitglied mensch[50];
	*personen = mensch[50];
	
	
	printf("Geben Sie den Nachnamen des neuen Mitglieds ein\n");
	fgets(personen->nachname, 50, stdin);
	
	
	
	printf("Geben Sie den Vornamen des neuen Mitglieds ein\n");
	fgets(personen->vorname, 50, stdin);
	
	

	
	printf("Geben Sie die Mitgliedsnr des neuen Mitglieds ein\n");
	fgets(personen->mitgliedsnr, 50, stdin);
	
	
	
	printf("Geben Sie die Telefonnr des neuen Mitglieds ein\n");
    fgets(personen->telefonnr, 50, stdin);
	
	
	*personen++;
  
	
}


Kann ich mit der Funktion 50 Mitglieder speichern ? Ich glaube das müsste so gehen. ^^

Noch eine weitere kleine frage:
Code:
	while(1){
		
	printf("(1)Ausgabe eines vorhandenen Eintrags\n");
	printf("(2)Eingabe eines neuen Eintrages\n");
	printf("(0)Ende des programms\n");
	printf("Eingabe: \n");
	fgets(menustring,10,stdin);
    sscanf(menustring,"%d",&menu);
	
	
	
	
	
	

	switch(menu){
			
			
		case 1:
		
			break;
			
			
			
		case 2:
			
		    
			eingabe(personen);
		    
			
			
			
		case 0:
			
			return 0;
			break;
			
	
	
	
		default:
		printf("Geben Sie bitte eine der angegeben Nummer ein!\n");
	        
	
	 
	
	
	}
	}

Ich habe in der main diese Whileschleife. Warum wird das programm nach einmaligen durchführen der eingabe (Switch(2)) abgebrochen?
 
Zu 2: Beim case 2 hast du das break vergessen.
Nach eingabe(personen) wird also darunter mit dem case 0 weitergemacht, und da steht dann eben ein return.

Btw beim case 0 müsstest du nicht unbedingt ein break machen, da return sowieso alles beendet. Schaden tuts aber auch nicht.

Zu 1:
Vom Denkfehler einmal abgesehen, hast du noch immer zwei :)
1: Die Variable mensch hat 50 Mitglieder. Da bei 0 zu zählen begonnen wird, von 0 bis 49.
Du kannst also für personen nicht den Mensch 50 hernehmen, der letzte wäre 49.
2: mensch wird am Schluss von eingabe wieder komplett entfernt.
Mit der zweiten Eingabe den zweiten Mensch hinzufügen würde also nicht gehen, da der erste dann schon wieder weg ist :)
Um den Wert zu behalten könnte man static vor die Variable schreiben oder einfach im main anlegen und übergeben.
Dann wirds erst am Ende von main entfernt.

Also:
Mensch in main anlegen
In eingabe das *personen++ und die ersten zwei Zeilen entfernen.
Im main noch ein int (zb eingabeanz) machen, mit dem man die Eingegebenen Personen mitzählt
Wenn eine neue eingegeben wird: "&mensch[eingabeanz]" an eingabe übergeben und dann eingabeanz um 1 erhöhen
Und beim Eingeben noch irgendeine Prüfung rein, ob mensch schon voll ist
 
Jetzt setzt es gleich zum Start des Programms einen Segmentation faul Fehler...

Code:
void eingabe(Mitglied *personen, Mitglied mensch[]){
	
	
	
	
	printf("Geben Sie den Nachnamen des neuen Mitglieds ein\n");
	fgets(personen->nachname, 50, stdin);
	
	
	
	printf("Geben Sie den Vornamen des neuen Mitglieds ein\n");
	fgets(personen->vorname, 50, stdin);
	
	

	
	printf("Geben Sie die Mitgliedsnr des neuen Mitglieds ein\n");
	fgets(personen->mitgliedsnr, 50, stdin);
	
	
	
	printf("Geben Sie die Telefonnr des neuen Mitglieds ein\n");
    fgets(personen->telefonnr, 50, stdin);
	
	
	
  
	
}


void ausgabe(){
	

	
	
	
};




int main(){
	
	char menustring[10];
	int menu;
	Mitglied *personen;
	Mitglied mensch[50];
	*personen = mensch[50];
	int eingabeanz=0;
	
	personen = (Mitglied*)malloc(100*sizeof(Mitglied));
	
	
	printf("Willkommen im Mitgliedsverzeichnis\n");
	printf("------------------------------------\n");
	printf("Aus Gruenden des Datenschutzes werden\nkeine Eintraege dauerhaft gespeichert.\n");
	printf("------------------------------------\n");
	
	while(1){
		
	printf("(1)Ausgabe eines vorhandenen Eintrags\n");
	printf("(2)Eingabe eines neuen Eintrages\n");
	printf("(0)Ende des programms\n");
	printf("Eingabe: \n");
	fgets(menustring,10,stdin);
    sscanf(menustring,"%d",&menu);
	
	
	
	
	
	

	switch(menu){
			
			
		case 1:
		
			break;
			
			
			
		case 2:
			
		    
			eingabe(personen,&mensch[eingabeanz]);
			eingabeanz++;
			*personen++;
			break;
		    
			
			
			
		case 0:
			
			return 0;
			break;
			
	
	
	
		default:
		printf("Geben Sie bitte eine der angegeben Nummer ein!\n");
	        
	
	 
	
	
	}
	
		
		
	}
	
	free(personen);
	return 0;	
	
}

liegts an der Position von malloc ?
 
Ich hatte mir das eigentlich so vorgestellt:

Code:
void eingabe(Mitglied *personen){
	
	
	
	
	printf("Geben Sie den Nachnamen des neuen Mitglieds ein\n");
	fgets(personen->nachname, 50, stdin);
	
	
	
	printf("Geben Sie den Vornamen des neuen Mitglieds ein\n");
	fgets(personen->vorname, 50, stdin);
	
	

	
	printf("Geben Sie die Mitgliedsnr des neuen Mitglieds ein\n");
	fgets(personen->mitgliedsnr, 50, stdin);
	
	
	
	printf("Geben Sie die Telefonnr des neuen Mitglieds ein\n");
    fgets(personen->telefonnr, 50, stdin);
	
	
	
  
	
}


void ausgabe(){}

int main()
{
	char menustring[10];
	int menu;
	Mitglied *personen;
	int eingabeanz=0;
	
	personen = (Mitglied*)malloc(100*sizeof(Mitglied));

	printf("Willkommen im Mitgliedsverzeichnis\n");
	printf("------------------------------------\n");
	printf("Aus Gruenden des Datenschutzes werden\nkeine Eintraege dauerhaft gespeichert.\n");
	printf("------------------------------------\n");
	
	while(1){
		
	printf("(1)Ausgabe eines vorhandenen Eintrags\n");
	printf("(2)Eingabe eines neuen Eintrages\n");
	printf("(0)Ende des programms\n");
	printf("Eingabe: \n");
	fgets(menustring,10,stdin);
    	sscanf(menustring,"%d",&menu);
	
	switch(menu){
		case 1:
			break;
			
		case 2:
			if(eingabeanz>=99)
			{
				printf("Zu viele!\n");
				break;
			}
			eingabe(&personen[eingabeanz]);
			eingabeanz++;
			break;

		case 0:
			return 0;
			break;

		default:
		printf("Geben Sie bitte eine der angegeben Nummer ein!\n");

		}

	}
	free(personen);
	return 0;	
	
}
 
Erstmal Danke, ich würd das wohl nie hinbekommen...

Pointer sind wahrlich nix für mich oder noch nicht, wer weiß...

Code:
void ausgabe(Mitglied *personen){

	char ausgabe[50];
	int zahler=0;
	
	printf("Wie lautet die gesuchte Mitgliedsnr?\n");
	fgets(ausgabe, 50, stdin);
	
	for(zahler=0;zahler<100;zahler++){
		
		if(personen[zahler].mitgliedsnr==ausgabe){
			
			
			printf("Name : %s",personen[zahler].nachname);
			printf("Vornname : %s",personen[zahler].vorname);
			printf("Mitgliedsnr : %s",personen[zahler].mitgliedsnr);
            printf("Telefonnr : %s",personen[zahler].telefonnr);
			
			
		}
		else {
			printf("Diese Mitgliedsnr existiert nicht!\n");
			zahler = 100;
		}

	
	
	}

	
	
	
}; 


.
.
.
.
 
	case 1:
			
	     	
			
			ausgabe(personen);
			
			
			break;


Muss ich die personen auch anders übergeben oder warum funktioniert das nicht so richtig?
Ich hab ja nie die genaue position im speicher deswegen kann ich es als Adresse ja nicht übergeben, oder ?
 

Neue Beiträge

Zurück