Strukturen (Telefonbuch)
-
Hallo liebes Forum ich habe folgendes Problem
(Bin noch recht neu in der C Sprache bitte nicht zu hart sein
)
Also ich soll eine Struktur verwenden um ein Telefonbuch zu programmieren und habe kleine Probleme am Anfang. Undzwar möchte ich z.B. Vorname, Nachname, Nummer, etc. einlesen können d.h. per scanf dachte ich in einer for Schleife und mein Ergebnis sieht zur Zeit folgendermaßen aus.
#include<stdio.h> #include<string.h> #define LANG 5 struct Telefonbuch { char surname [20]; char forename [20]; char area_code [5]; char tel_nr [15]; }; int main (void){ int i; char a[LANG], b[LANG], c[LANG]; struct Telefonbuch eintrag[LANG]; for (i = 0; i < LANG; i++) { printf ("Vorname?"); scanf ("%c", &a[i]); /*malloc?! -> dynamischen array erstellen*/ printf ("Nachname?"); scanf ("%c", &b[i]); /*pointer auf a? oder so lassen? -> Testen!*/ printf ("Nummer?"); scanf ("%c", &c[i]); strcpy (eintrag[i].surname , a[i]); /*Oder hier pointer auf a? Oder malloc / malloc + pointer auf a?*/ strcpy (eintrag[i].forename , b[i]); strcpy (eintrag[i].tel_nr , c[i]); } struct Telefonbuch telefonbuch[LANG]; for (i = 0; i < LANG; i++){ telefonbuch[i] = eintrag[i]; } for (i = 0; i < LANG; i++) { printf("%s, %s\t : %s\n", telefonbuch [i].surname, telefonbuch [i].forename, telefonbuch [i].tel_nr); } return 0; }
warning: passing argument 2 of 'strcpy' makes pointer from integer without a cast
was genau mache ich hier falsch? wäre sehr dankbar
-
chars sind einzelne Zeichen. a[i] ist ein char und somit ein einzelnes Zeichen. Kein sinnvolles Argument für strcpy. Ebenso ist %c der Formatspezifizierer für einzelne Zeichen. Warum überhaupt die Zwischenstation?
(Ungetestet):int main (void){ int i; struct Telefonbuch eintrag[LANG]; for (i = 0; i < LANG; i++) { printf ("Vorname?"); fgets(eintrag[i].forename, 20, stdin); printf ("Nachname?"); fgets(eintrag[i].surname, 20, stdin); printf ("Nummer?"); scanf (" %15[0123456789/ +]", &eintrag[i].tel_nr); } }
Da gehört natürlich noch unbedingt eine Überprüfung dazu, ob die Eingaben erfolgreich und vollständig waren. Insbesondere kann es sehr leicht vorkommen, selbst bei gängigen europäischen Namen und Telefonnummern, dass deine geizigen 15-20 Zeichen nicht ausreichend sind.
P.S.: fgets kopiert übrigens auch abschließendes newline-Zeichen. Dieses willst du wahrscheinlich entweder entfernen oder einen passenden scanf-Formatstring benutzen (entweder %s (trennt jedoch bei Leerzeichen) oder %[^\n] (muss man aber bei der nächsten Eingabe aufpassen, dass ein '\n' noch da ist)).
-
Braucht man für das fgets SDL? Also bei mir kommt folgender Fehler
ld.exe||cannot find -lSDLmain|
#include<stdio.h> #include<string.h> #define LANG 5 struct tel_dir { char surname [30]; char forename [30]; char area_code [5]; char tel_nr [15]; }; void datensatz (struct tel_dir *k, int eingabe, int *gesetzt){ int sizeSurname = 0, sizeForname = 0, sizeArea_code = 0, sizeTel_nr = 0; sizeSurname = sizeof (k->surname); sizeForname = sizeof (k->forename); sizeArea_code = sizeof (k->area_code); sizeTel_nr = sizeof (k->tel_nr); printf ("Eintrag ins Telefonbuch an der Stelle %d: \n\n", eingabe); printf ("Vorname: "); fgets (k->surname, sizeSurname-1, stdin); printf ("Nachname: "); fgets (k->forename, sizeForname-1, stdin); printf ("PLZ: "); fgets (k->area_code, sizeArea_code-1, stdin); printf ("Telefon Nr.: "); fgets (k->tel_nr, sizeTel_nr-1, stdin); *gesetzt = 1; } int main (void){ struct tel_dir eintrag[LANG]; int eingabe = 0, i = 0, gesetzt[LANG]; do { printf ("%d mögliche Telefonbucheinträge! welchen beschreiben? (1-%d)", LANG); scanf ("%d", &eingabe); if (eingabe == 0 || eingabe > LANG){ printf ("Eingabe nicht im definiertem Bereich!! (1-%d)", LANG); return (0); } i = eingabe-1; if (gesetzt[i] == 0){ datensatz (&eintrag[i], eingabe, &gesetzt[i]); }else{ printf ("Vorname: %s\n", eintrag[i].surname); printf ("Nachname: %s\n", eintrag[i].forename); printf ("PLZ: %s\n", eintrag[i].area_code); printf ("Tel Nr.: %s\n", eintrag[i].tel_nr); } }while (1); return (0); }
Momentan sieht es halt so bei mir aus
-
Nein, fgets ist Bestandteil der C-Standard-Library.
In diesem Unterforum geht es um Standard-C.
Da gibt es schon genug Unterschiede zwischen C89 und C99. Und auf die wirst du im Zweifel auch hingewiesen.
Erst recht wenn Teile aus Nicht-Standard-Librarys vorgeschlagen würden.
-
Push habe den Code im Beitrag davor reinkopiert bitte guckt ihn euch an woran es denn jetzt liegt
Ich habe das Gefühl da überspeichert sich etwas wenn ich sage ich will den 2ten Eintrag angucken OHNE vorher was reinzuschreiben und dann steht schon sowas da oder random memory halt:
Vorname: 61�
Nachname: 1�
PLZ:
Tel Nr.: 8�H��Obwohl ich nichts eingegeben hatte
-
Ich nehme an du hast eine IDE?
Welches Projekt hast du denn da ausgewählt?Nur Kopieren hilft da selten. Du solltest schon wissen, wie du die benutzt, wenn du mit so etwas arbeitest.
-
Sanj3k schrieb:
Ich habe das Gefühl da überspeichert sich etwas wenn ich sage ich will den 2ten Eintrag angucken OHNE vorher was reinzuschreiben und dann steht schon sowas da oder random memory halt: ...
Ja, das ist richtig.
Auf einer Schultafel steht meist auch immer etwas. Der Stoff vom letzten Nutzer der Tafel.
Auch Morgens in der ersten Stunde.