structuren, kann man das essen??
-
hey
alsö semester ist wieder im gange und ich komm nit klar,...
das prob ist warscvheinlich ganz leicht, aber ich komme mit klar.
funktion soll sein, adressen einlesen, speichern und ausgeben.#include <stdlib.h> #include <stdio.h> #include <string> struct adressen { char name[21]; char forename[21]; char steet[21]; int number; char city[21]; int postcode; int phonenr; }; int i; int main (void) { struct adressen adi={0}; adi.name[21]; adi.forename[21]; adi.steet[21]; adi.number; adi.city[21]; adi.postcode; adi.phonenr; for (i=0; i<3; i++) { printf("adi.name: "); scanf("%s", adi.name); //.... usw }; printf("sex.name: %s", adi.name); }
alles was ich hin bekomme ist das er den 3. wieder ausgibt (speicher hab ich hier noch mal weg gelassen)
danke schon mal
ps. hat jemand nen guten buchtipp?? die bisheriegen konnten das thema nit wirklich erklären oder sie waren in c++ (cin+ cout usw) geschrieben
-
Hallo,
also erstmal reservierst du praktisch 2 x Speicher, was unnötig ist:
// Das kann alles weg... adi.name[21]; adi.forename[21]; adi.steet[21]; adi.number; adi.city[21]; adi.postcode; adi.phonenr;
Wozu soll die Schleife gut sein? Ich verstehe denn Sinn momentan nicht. Du würdest praktisch alles 3 x eingeben und hättest nur den letzten Wert. Wenn du mehrere Datensätze einlesen willst, musst du ein Array erstellen, was aus structs besteht:
struct adressen adi[200]; // Reserviere Speicher für 200 structs
Strings würde ich auch nicht mit scanf einlesen, sondern eher mit man: fgets(). Scanf liest nur bis zum ersten Leerzeichen, falls du das natürlich möchtest, ist es auch so ok. Ein gutes (Online)Buch gibt es hier:
www.pronix.deEDIT: In diesem Buch gibt es auch ein Beispiel, was im im Grunde genau das erklärt, was du vorhast. Natürlich ist es einfach, die Lösung abzuschreiben, ich würde erstmal noch selber überlegen.
-
Hmmm dies macht gar nichts:
adi.name[21]; adi.forename[21]; adi.steet[21]; adi.number; adi.city[21]; adi.postcode; adi.phonenr;
Du gibst aus befor du einliest und das drei mal
for (i=0; i<3; i++) { printf("adi.name: "); scanf("%s", adi.name); //.... usw };
Am Schluss gibst dus nochmal aus:
printf("sex.name: %s", adi.name);
Ups es hat schon jemand geantwortet
-
hallo,
wofür ist dieser code?
adi.name[21]; adi.forename[21]; adi.steet[21]; adi.number; adi.city[21]; adi.postcode; adi.phonenr;
durch die anweisung:
struct adressen adi={0};
hast du schon die ganzen komponenten des structes und die erste komponente auch noch mit 0 initialisiert.
mit: adi.name[21] = 'X'; würdest du in der komponente "name" des structes "adi" an dem index 21 ein "X" speichern.zum thema speichern: wieviele adressen sollen den eingelesen werden und wo sollen sie gespeichert werden?
spontan fallen mir da 3 möglichkeiten ein:1. array vom typ struct adi:
//deklaration struct adi adressensammlung[20]; //zugriff auf index 0 des elements name der 10. adresse adressensammlung[9].name[0] = 'X';
2. eine (mehrfach) verkettete liste
struct adressen { char name[21]; char forename[21]; char steet[21]; int number; char city[21]; int postcode; int phonenr; // hier müssen pointer vom typ struct adressen eingfügt werden // um die adressen des nachfolgers bzw vorgängers zu speichern struct adressen *prev; struct adressen *next; };
wird es aber wahrscheinlich nicht sein, wenn ihr gerade erst mit structs angefangen habt. wenn doch sag bescheid und ich poste dir eine funktion mit der du eine liste von struct adresse erstellen kannst.
3. in einer datei:
da mußt du mit den funktionen fopen() und fclose() arbeitenFILE *fp; //ist der ein- bzw ausgabestrom fp = fopen("DATEINAME bzw PFAD", "kennung für das was du mit der datei anstellen willst"); // r = read || // w = write // und noch paar mehr die ich aber nachschauen müßte // die "" mußt du auf jeden fall mit angeben fputs(adi.name, fp); // gibt den inhalt von adi.name in die zuvor geöffnete datei aus
hoffe dir etwas geholfen zu haben. wenn du konkrete fragen stellst versuche ich sie zu beantworten.
grüße,
sternenstaub
P.S.: sollte jemand einen fehler entdecken macht mich bitte darauf aufmerksam
P.P.S.:
dali schrieb:
Ups es hat schon jemand geantwortet
da habe ich doch um einiges länger getippt als gedacht...
-
viel dank noch mal für die ersten emails!!
alsö,
ich hab mal etwas weiter gebastelt und versucht zu verstehen was da in unserem skript steht. (ist immer schön wenn alles nach quelltext aussieht)
mein aktueller stand
#include <stdlib.h> #include <stdio.h> //#include <string> #include <windows.h> #define max 200 struct adressen { char name[21]; char forename[21]; char steet[21]; int number; char city[21]; int postcode; int phonenr; }; int i, auswahl, miss; void anzeige (struct adressen *p_adi); void eingeben (struct adressen *p_adi); void loeschen (struct adressen *p_adi); void suchen (struct adressen *p_adi); /* +++ Main Programm +++ */ int main (void) { struct adressen adi[max]; // Reserviere Speicher für 200 structs struct adressen *p_adi = adi; // struct adressen *adi= malloc(i *sizeof(struct adressen)); do { auswahl = 0; miss = 0; printf("namen anzeigen 1\n"); printf("namen eingeben 2\n"); printf("namen loeschen 3\n"); printf("namen suchen 4\n\n"); printf("ende 0\n\n"); miss = scanf("%d", &auswahl); fflush (stdin); if ((auswahl<=0) || (auswahl>=4) || (miss==0)) printf("ungültige eingabe, 0-4\n\n"); }while ((auswahl<=0) || (auswahl>=4) || (miss==0)); switch (auswahl) { case 0: exit; //nachsachauen!!!!!! break; case 1: anzeige(adi); break; case 2: eingeben(adi); break; case 3: loeschen(adi); break; case 4: suchen(adi); break; default: printf("ungültige eingabe, 0-3"); } for (i=0; i<3; i++) { printf("name eingeben: "); scanf("%s", adi[i].name); }; for (i=0; i<3; i++) { printf("namen: %s\n", adi[i].name); }; return 0; }; /* +++ Sub-Programm +++ */ /* + anzeigen der daten + */ void anzeige (struct adressen *p_adi) { // //FILE = fopen(char *filename, "char *r); for (i=0; i<1; i++) { printf("namen: %s\n", p_adi->name); }; }; /* + eingeben der daten + */ void eingeben (struct adressen *p_adi) { for (i=0; i<1; i++) { printf("name eingeben: "); scanf("%s", p_adi->name); }; }; usw....
normale namen kan ich jetzt eingeben, aber wie geht das wenn ich sie in den unterprogrammen öfeenen und schreiben will??
da gibt er mir nur den letzten. brauch man dafür "typedef"
ich hab bisher nur volle bilschirme (müll) oder speicherverletzungen gehabt.ikke
-
Hab da ein paar anmerkungen zu deinem prog
#define max 200
du überschreibst damit die existierende definition von max besser wäre
#define MAXADRESSEN 200
struct adressen { char name[21]; char forename[21]; char steet[21]; int number; char city[21]; int postcode; int phonenr; };
ok das funktioniert aber warum nennst du diese struct adressen wenn es eigentlich nur eine "adresse" ist. ( auch kein problem)
da ich nicht ganz verstehe was du eigentlich bezweckst habe ich dein hauptprogramm umgebaut.
int main (void) { struct adressen adi[max]; // Reserviere Speicher für 200 structs struct adressen *p_adi = adi; //p_adi zeigt jetzt auf die erste adresse // entspricht adressen *p_adi = &adi[0]; // struct adressen *adi= malloc(i *sizeof(struct adressen)); do { auswahl = 0; miss = 0; printf("namen anzeigen 1\n"); printf("namen eingeben 2\n"); printf("namen loeschen 3\n"); printf("namen suchen 4\n\n"); printf("ende 0\n\n"); miss = scanf("%d", &auswahl); fflush (stdin); if ((auswahl<=0) || (auswahl>=4) || (miss==0)) printf("ungültige eingabe, 0-4\n\n"); switch (auswahl) { case 0: miss = 0; // abbruchbedienung setzen break; case 1: anzeige(adi); break; case 2: eingeben(adi); break; /* case 3: loeschen(adi); break; case 4: suchen(adi); break; */ default: printf("ungültige eingabe, 0-3"); } }while (miss!=0); // abbruch /* for (i=0; i<3; i++) { printf("name eingeben: "); scanf("%s", adi[i].name); }; for (i=0; i<3; i++) { printf("namen: %s\n", adi[i].name); }; */ return 0; };
hoffe das bringt dich weiter
Kurt
-
ich möchte eine adressdatei erstellen und bis auf das hauptauswahlmenü soll alles in unterprogramen verfrachtet werden.
aber sobald ich das mache kann ich nicht mehr sinvoll ausgeben, ich bekomme die werte nicht auf die plätze die im hauptprogramm verwalltet werden sollen.
d.h. ich komme mit den ointern nicht an die daten bzw. bekomme keine daten in den kurzspeicher.mfg
-
hi taugenichts
habe dein programm etwas überarbeitet und erweitert.vielleicht hilft dir das ja weiter.
#include <stdio.h> //#include <windows.h> #define max 200 #define ADRESSEN "adressen.dta" struct adressen { char name[21]; char forename[21]; char steet[21]; int number; char city[21]; int postcode; int phonenr; }; int i, auswahl, miss; FILE * f; void anzeige (struct adressen *p_adi); void eingeben (struct adressen *p_adi); void loeschen (struct adressen *p_adi); void suchen (struct adressen *p_adi); int getindex() { int i = -1; int auswahl = -1; printf("datensatz nummer ( -1 to cancel ) : "); i = scanf("%d", &auswahl); printf("\n"); if ( 1 == i ) return auswahl; return -1; } void init_db() { struct adressen a; int i; printf("initialisiere db\n"); loeschen(&a); for ( i = 0; i < max; i++ ) { speichern(&a, i); } printf("fertig\n\n"); } int speichern( struct adressen *p_adi, int wo ){ // adresse an index wo speichern int szwrite = 0; if ( wo >= 0 ) { fseek(f, wo * sizeof(struct adressen), SEEK_SET ); szwrite=fwrite(p_adi, sizeof(struct adressen), 1, f); if ( szwrite == 1 ) printf("record %d written\n\n", wo); } return szwrite != 0; } int lesen( struct adressen *p_adi, int wo ){ // adresse an index wo lesen int szread = 0; if ( wo >= 0 ) { fseek(f, wo * sizeof(struct adressen), SEEK_SET ); szread=fread(p_adi, sizeof(struct adressen), 1, f); if ( szread == 1 ) printf("record %d read\n", wo); if ( strstr( p_adi->name, "---" ) == p_adi->name ) printf("leerer datensatz\n\n"); } return szread != 0; } /* +++ Main Programm +++ */ int main (void) { struct adressen adi; struct adressen *p_adi = &adi; int done = 0; int fsize = 0; f = fopen(ADRESSEN,"r+b"); fseek(f, 0, SEEK_END); fsize = ftell(f) / sizeof(adi); printf("platz für %d adressen in db\n", fsize ); do { auswahl = 0; miss = 0; printf("\nnamen anzeigen 1\n"); printf("namen eingeben 2\n"); printf("namen loeschen 3\n"); printf("namen suchen 4\n"); printf("namen speichern 5\n"); printf("namen lesen 6\n"); printf("db initialisieren 7\n"); printf("ende 0\n\n"); miss = scanf("%d", &auswahl); fflush (stdin); switch (auswahl) { case 0: done = 1; break; case 1: anzeige(p_adi); break; case 2: eingeben(p_adi); break; case 3: loeschen(p_adi); // not implemented break; case 4: suchen(p_adi); // not implemented break; case 5: printf("adresse speichern\n"); speichern(p_adi, getindex()); break; case 6: printf("adresse lesen\n"); lesen(p_adi, getindex()); break; case 7: init_db(); break; default: printf("ungültige eingabe, 0-7"); break; } } while (done==0); fclose(f); return 0; }; /* +++ Sub-Programm +++ */ /* + anzeigen der daten + */ void anzeige (struct adressen *p_adi) { printf("namen: %s\n", p_adi->name); }; /* + eingeben der daten + */ void eingeben (struct adressen *p_adi) { printf("name eingeben: "); scanf("%s", p_adi->name); }; void loeschen (struct adressen *p_adi) { // als ungültig markieren strcpy(p_adi->name, "---"); } void suchen (struct adressen *p_adi) { }
Kurt