Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Daten in ein Struct einlesen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
21.10.2004, 14:44 Uhr
~modo_c_noob
Gast


Moin,

habe ein kleines Programm geschrieben welches ein Struct übergiebt, mit Daten füllt, an eine Ausgabefunktion übergiebt und dann ausgiebt.
Nun möchte ich die Inhalte nicht zuweisen, sondern vom Benutzer eingeben lassen. Leider klappt das nicht so wie ich mir das vorstelle.
Wäre nett wenn Ihr mir erklären/zeigen könntet wie das funktioniert!


C++:
# include <stdio.h>
# include <stdlib.h>

struct kontaktdaten
{
    char *name;
    char *vorname;
    char *strasse;
    int hausnummer;
    int plz;
    char *ort;
    int telefon;
    char *handy;
    char *email;
};

void eingabe(struct kontaktdaten *daten1);
void ausgabe(struct kontaktdaten *daten1);


int main()
{

  struct kontaktdaten daten;
  eingabe (&daten);
  ausgabe (&daten);


}
void eingabe (struct kontaktdaten *daten1)
{
  if(!daten1) return; // Speicherzugriffsfehler vermeiden


char name2[30];

printf("Bitte Name eingeben\n");
scanf ("%c",&name2[30]);
  
daten1->name = name2[30];
daten1->vorname= "Peter";
daten1->strasse = "Testweg";
daten1->hausnummer = 10;
daten1->plz = 12345;
daten1->ort = "Hamburg";
daten1->telefon = 1234567;
daten1->handy = "12345678910";
daten1->email = "peter@mustermann.de";

}
void ausgabe (struct kontaktdaten *daten1)
{
  if(!daten1) return; // Speicherzugriffsfehler vermeiden

printf ("Name: %s\nVorname: %s\nStrasse: %s\nHausnummer: %d\nPLZ: %d\nOrt: %s\nTel.: %d\nHandy: %s\nE-Mail: %s",
         daten1->name,daten1->vorname,daten1->strasse,daten1->hausnummer,
         daten1->plz,daten1->ort,daten1->telefon,daten1->handy,daten1->email);
}



Ich sage schon mal vielen Dank im Vorraus!!!


Bearbeitung von Windalf:

bevor ein standardgläubiger loskrakelt hab ich mir mal erlaubt aus dem "vomit main" ein "int main" zu machen


Dieser Post wurde am 21.10.2004 um 15:00 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
21.10.2004, 14:51 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



Zitat:


C++:
struct kontaktdaten
{
    char *name;
    char *vorname;
    char *strasse;
    int hausnummer;
    int plz;
    char *ort;
    int telefon;
    char *handy;
    char *email;
};





char* ist nur ein zeiger... uninitialisiert zeigt der auf irgend einen speicherbereich der dir nicht gehört und wenn du darin rummülen willst ist das beste was die vermutlich passieren kann ein speicherzugrifffehler...

du musst entweder z.b. char name[30]; definieren oder du musst den speicher erst entsprechend mit malloc allokieren...

ups hier ist noch ein fehlerchen


C++:
scanf ("%c",&name2[30]);


%c list nur ein zeichen ein du willlst aber eine zeichenfolge einesen...


C++:
scanf ("%s",name2);


aber bedenke das nur 29+ 1 terminierungszeichen in den buffer passen wenn der user mehr eingibt knallt es...
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 21.10.2004 um 15:02 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
21.10.2004, 15:08 Uhr
~modo_c_noob
Gast


Vielen Dank für die Antwort!

Ich habe es jetzt folgendermaßen definiert:


C++:
struct kontaktdaten
{
    char name[30];
    char *vorname;
    char *strasse;
    int hausnummer;
    int plz;
    char *ort;
    int telefon;
    char *handy;
    char *email;
};

//....

char name2[30];

printf("Bitte Name eingeben\n");
scanf ("%c",&name2[30]);
  
daten1->name = name2[30];



Ich erhalte jetzt jedoch folgende Fehlermeldung:

DVisualStudio\MSDev98\MyProjects\Struct\Struct1_2.cpp(47) : error C2440: '=' : 'char' kann nicht in 'char [30]' konvertiert werden
Es gibt keine Konvertierungen von Feldtypen, obwohl es Konvertierungen von Verweisen oder Zeigern in Felder gibt
Fehler beim Ausführen von cl.exe.

Struct1_2.obj - 1 Fehler, 0 Warnung(en)

Speicher allokieren habe ich bis jetzt noch nicht gemacht und weiß ich auch nicht wie das funktioniert.
Wäre super wenn ich weitere Hilfe bekommen könnte!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
21.10.2004, 15:12 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


ja du kannst das nicht gleichsetzen (der versucht dann adressen (die der pointer)gleichzusetzen und nicht jedes element des arrays einzelen...)
kannst dir mit sowas wie strcpy und sprintf behelfen oder ne eigene schleife schreiben...
name2 brauchst du eigentlich auch nciht mehr du kannst da direkt in den von der struktur bereihtgeahltenen speicher z.b. mit scanf schreiben...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
21.10.2004, 16:41 Uhr
(un)wissender
Niveauwart


Dein Ansatz ist, wie soll ich sagen, zum Scheitern verurteilt. Für dein struct bzw. seinen Inhalt musst du dir Speicher besorgen. Du hast unverschämtest Glück, dass ein Stringliteral, welches zu Kompilerzeit bekannt ist (bspw. "Peter") konstant und gültig in allen Sichtbarkeitbereichen bleibt.
Wenn du jetzt nach der Zuweisung von "Peter" an einen Pointer den Inhalt verändern willst kracht es.
Schau dir mal die Definition von statischen Array, dynamischer Speicherverwaltung und den Gültigkeitsbereich von Variablen an.

Zuweisungen so

C++:
char *literal;

void func(void)
{
   const char* test = "Peter";
   literal = malloc(strlen(test ) + 1);
   strcpy(literal, test);
}

//free (literal)




oder so


C++:
char literal[20];

void func(void)
{
   const char* test = "Peter";
   strncpy(literal, test, 20); //höchsten 20 Zeichen, ev. nicht Null-terminiert!
}



Pointerzuweisungen (Array)


C++:
//Gültigkeitsbereich beachten!
char test[3];
char * testp = &test[0];


--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
21.10.2004, 16:49 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@(un)wissender
hey das ist mein patient
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
21.10.2004, 17:01 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat von Windalf:
@(un)wissender
hey das ist mein patient

Vielleicht krankte es deshalb ja?
SCNR
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
21.10.2004, 17:04 Uhr
(un)wissender
Niveauwart



Windalf, ich überlasse ihn deinen treu sorgenden Händen, damit er auch bald gut golfen kann.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
21.10.2004, 17:19 Uhr
~mike
Gast


Hi!
Kann man in diesem Fall nicht strdup verwenden?

mfg
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
21.10.2004, 17:24 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


er kanns doch direkt in sein struct einlesen, dann kann er die temporären-variablen weglassen. Natürlich muss er im struct nicht nur name als name[30] definieren sondern den rest auch, alle anderen pointer wären sonst uninitialisiert
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: