Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Struktur einlesen in Funktion

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 <
000
16.01.2004, 15:50 Uhr
Vriza



Hoi!

Folgendes Problem:

Ich will eine Struktur in einer Funktion einlesen, bekomme aber immer einen Speicherfehler "Die Anweisung in "0x0040 ..." verweist auf Speicher in "0x000000". Der Vorgang "written" konnte nicht auf dem Speicher durchgeführt werden... " sobald ich die erste Eingabe mache.

Hier der Code:


C++:
int spieleingabe  (spielsatz *spiel, int anz)

{


    printf("\n Geben Sie dem Spiel eine Nummer\n ");
    scanf("%d", &spiel->nr);
    printf("\n Wie lautet der Name des Spieles? \n");
    scanf("%s", spiel->titel);
    printf("\n Wie heißt der Autor des Spieles? \n");
    scanf("%s", spiel->titel);
    printf("\n Geben Sie eine kurze Inhaltsangabe des Spiels an: \n");
    scanf("%s", spiel->inhalt);

    anz++; //zählt die Anzahl der Spiele mit

    return anz;

}




Der Funktionsaufruf:

C++:
anz=spieleingabe(spiele, anz);



Das dyn. Array Spiele ist oben im Programm mit ...

C++:
spielsatz *spiele=NULL;


... deklariert

Hier noch die Struktur:

C++:

struct spielsatz{
    int nr;
    char titel[50];
    char autor[50];
    char inhalt[200];
};




mfG

Vriza
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
16.01.2004, 15:54 Uhr
virtual
Sexiest Bit alive
(Operator)


1. das 3. scanf soll wahrscheinlich nach spiel->autor schreiben.
2. Das

C++:
spielsatz *spiele=NULL;


ist erstmal nur ein Zeiger, kein Array: wo und wie belegst Du denn speicher für das Array?
--
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
002
16.01.2004, 16:11 Uhr
Vriza




Zitat:
virtual postete
1. das 3. scanf soll wahrscheinlich nach spiel->autor schreiben.
2. Das

C++:
spielsatz *spiele=NULL;


ist erstmal nur ein Zeiger, kein Array: wo und wie belegst Du denn speicher für das Array?



Zu 1.)
Hast recht, ist ein Tippfehler gewesen

Zu 2.)

Das ist anscheinend mein Fehler
Ich hab vergessen Speicher für das Array zu allokieren.

Jetzt funktioniert es einigermaßen.

Habe aber trotzdem noch eine Frage:

Und zwar, wenn ich den Spielnamen einlese zB. "Deus Ex", dann überspringt das Programm die Eingabe des Autors. Das liegt daran, da das Leerzeichen im Spielenamen vorhanden ist. Wenn ich zB. ein Spiel wie "Age of Mythology" reinschreiben würde, würde er die nächsten beiden Abfragen überspringen.
Ich nehme an dass er beim Beispiel von "Age of Mythology" das "Age" in den Titel speichert, das "of" in den Autor und das "Mythology" in die Inhaltsangabe.

Ich würd gern wissen wie sich das vermeiden lässt. Immerhin hab ich auch eine Eingabe für die Inhaltsangabe und dort sind einige Leerzeichen zu machen

Dieser Post wurde am 16.01.2004 um 16:11 Uhr von Vriza editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
16.01.2004, 16:16 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


dann solltest du getline statt scanf verwenden...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
16.01.2004, 16:22 Uhr
Vriza



Kannst du mir bitte die genaue Syntax von "getline" schreiben? Ich hab das nämlich bisher noch nicht genutzt. Muss ich da auch noch eine zusätzliche Header Datei in meine Programm einfügen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
16.01.2004, 16:22 Uhr
virtual
Sexiest Bit alive
(Operator)


Nimm fgets an stelle von scanf (ist sicherer wg bufferoverflow), du musst dann allerding noch das '\n' am Ende der Eingabe entfernen. Wenn es unbedingt scanf sein soll, hilft manchmal auch

C++:
scanf("%[^\n]s", ...);


Allerding bleibt in diesem fall das '\n' im Stream und du mußt es ebenfalls per hand rauslesen:

fgets Lösung:

C++:
#include <stdio.h>

int main()
{
    char buffer[100];
    size_t len;

    fgets(buffer, sizeof(buffer), stdin);
    if (buffer[len=strlen(buffer)-1]=='\n') buffer[len] = 0;
    printf(">%s<\n", buffer);
    fgets(buffer, sizeof(buffer), stdin);
    if (buffer[len=strlen(buffer)-1]=='\n') buffer[len] = 0;
    printf(">%s<\n", buffer);
}


scanf lösung:

C++:
#include <stdio.h>

int main()
{
    char buffer[100];
    scanf("%[^\n]s", buffer);
    printf(">%s<\n", buffer);
    getc(stdin); /* '\n' überspringen */
    scanf("%[^\n]s", buffer);
    printf(">%s<\n", buffer);
    getc(stdin); /* '\n' überspringen */
}


--
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
Seiten: > 1 <     [ 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: