Programm hängt sich auf beim ausführen mit eclipse
-
Hallo ich benötige Hilfe bei der Fehlersuche. Mein Programm hängt sich immer auf sobald ich die Funktion new_contact Aufrufe und meinen Vornamen eingebe.
Vielen dank schonmal im vorraus für euere Hilfe!#include <stdio.h> #include <stdlib.h> #include <strings.h> struct Kontakt { char *Vorname[20]; char* Nachname; char* Strasse; int Hausnummer; int Postleitzahl; char* Ort ; int Telefonnummer; char* Mobilfunknummer; char* Emailadresse; } Kontaktverzeichnis; void output (char * pointer) { //printf("Vorname: %s\n", pointer->Vorname); } void new_contact(struct Kontakt * pointer) { char eingabe[20]; printf("Bitte geben sie ihren Vornamen ein\n"); scanf("%s", &eingabe); printf("%s",&eingabe); strcpy(pointer->Vorname[20], eingabe); printf("Bitte geben sie ihren Nachnamen ein\n"); scanf("%s", &eingabe); // strcpy(p->Nachname, eingabe); } int main(int argc, char* argv[]) { setbuf(stdout, NULL);// damit die eclipse konsole auch für dieses programm funktioniert struct Kontakt * pointer; int zahl_menue; printf("1 Falls sie einen neuen Kontakt hinzufuegen wollen\n"); printf("2 Falls sie einen Kontakt suchen und ausgeben wollen\n"); printf("3 Zum Speichern alle Kontakte in einer Datei im ausgewählten Pfad des Benutzers\n"); printf("4 Zum laden aller Kontakte in einer Datei zum ausgewählten Pfad des Benutzers\n"); printf("5 Falls sie das Programm beenden wollen\n"); scanf("%d", &zahl_menue); switch(zahl_menue) { case 1: printf("Das war eins \n"); new_contact(pointer); break; case 2: printf("Das war zwei \n"); output(pointer); break; case 3: printf("Das war drei \n"); break; case 4: printf("Das war vier \n"); break; case 5: printf("Das war fünf \n"); break; } /* Ende switch */ if(zahl_menue==5) { return 0; } else { main(argc,argv); } }
-
Wo zeigt denn pointer hin?
Der Zeiger ist nicht initioalisiert, er zeigt irgendwo hin.
Du musst pointer auf gültigen Speicher zeigen lassen.Achte auf die Compiler
warnungen
.
Die Paramter für printf und scanf (in new_contact) sind falsch.
Da gehört kein & hin.
Überleg dir nochmal deine struct:struct Kontakt { char *Vorname[20]; // 20 Zeiger auf char Sollen die für 20 Vornamen sein?) char* Nachname; // Zeiger auf char. Dahinter verbirgt sich erstmal kein gültiger Speicher char* Strasse; // wie Nachname int Hausnummer; // wie soll da 4a abgespeichert werden ? int Postleitzahl; // eine Postleitzahl ist keine Ganzzahl (es gibt welche mit führenden Nullen= char* Ort ; // wie Nachname int Telefonnummer; // viel Spass mit der Vorwahl. char* Mobilfunknummer; // wie Nachname char* Emailadresse; // wie Nachname } Kontaktverzeichnis;
schlaeth schrieb:
strcpy(pointer->Vorname[20], eingabe);
Du hast zwar 20 Einträge für Vornamen, aber
1. hast du dafür keinen Speicher reserviert
2. existiert der Eintrag [20} gar nicht, da Arrays immer mit dem Index 0 anfangen. Also ist der höchste Index (bei 20 Elemnten) 19.Den rekursiven Aufruf von main solltest du auch lassen.
-
Zunächst einmal vielen Dank für deine schnelle Hilfe.
1. Bei den Pointern bin ich leider noch blutiger Anfänger:( kannst du mir bitte ein Beispiel oder eine Erklärung geben was ich falsch gemacht habe und wie es Aussehen müsste.
2. Printf ohne& hab das eben mal ausprobiert und dann hat sich das Programm schon beim scan bzw. bei der ausgabe aufgehangen mit & funktionieren beide Vorgänge aber.
3. Bei Struct Aller klar soweit bis auf die Pointer Geschichte mit dem gültigen Speicher bereich wie müsste es aussehen damit es ein Gültiger Speicherberecih ist
4. Array mit den zwanzig Feldern habe ich herraus genommen wird ja sowieso immer gleich ins struct geschrieben durch strcpy, sobald das Programm funktioniert
5. Der rekursive Aufruf ist Teil der Aufgabe muss ich daher drin lasssen
-
Da du von Pointer noch keine Ahnung hast, für den Anfang:
struct Kontakt { char Vorname[20]; // Platz für 20 Zeichen char Nachname[20]; char Strasse[20]; usw. ... }
Bedenke:
char
ist etwas anderes alschar*
char
ist etwas anderes alschar[]
struct Kontakt Kontakte[10]; // Richtigen Speicher für die Daten struct Kontakt *pointer = Kontakte ; // pointer ist ein extrem dämlicher Name
int new_contact(struct Kontakt * pointer) // Es findet sich sicher ein sinnvoller Wert für die Rückgabe { char eingabe[20]; printf("Bitte geben sie ihren Vornamen ein\n"); scanf("%19s", eingabe); printf("%s",eingabe); strcpy(pointer->Vorname, eingabe); printf("Bitte geben sie ihren Nachnamen ein\n"); scanf("%19s", eingabe); strcpy(pointer->Nachname, eingabe); return 0; }
Wenn du das Programm damit läuft. kannst du dich auch an dynamische Speicherverwaltung wagen. Dann bist du nicht auf 20 ZEichen beim Vrnamen angewiesen. Oder auf 10 Kontakte.
5. Der rekursive Aufruf ist Teil der Aufgabe muss ich daher drin lasssen
Der rekursive Aufruf von main? Hast du das falsch verstanden?
Wenn das wirklich so ist, schmeiss deine Lehrquelle weg.