Forum: PC-Programmierung C-Programm


von Hans Körber (Gast)


Angehängte Dateien:

Lesenswert?

Hi, nachdem mir dieses Forum schon einmal sehr geholfen hat, habe ich
noch einmal eine Frage.

In dem angehängten Programm lese ich die strings mit scanf ein, aber
wenn man einnen string mit Leerzeichen eingibt, dann dann überspringt
er die folgende scanfabfrage, auch wenn ich die Entereingabe mit
getchar() abfange.
Sollte ich eventuell besser fgets nehmen?

Danke im Vorraus.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

"struct.cpp" ist kein C-Programm, sondern verwendet die
Dateinamenserweiterung von C++-Programmen. Die werden vom Compiler
etwas anders als C-Programme übersetzt.
Da Du anscheinend C programmieren willst, solltest Du Deine Datei
umbenennen in "struct.c".
Allerdings solltest Du dann auch die Funktionsargumente von "main"
überarbeiten, da sonst der Compiler zu Recht motzt.

scanf ist eine äußerst gefährliche Funktion und sollte eigentlich aus
der C-Standardlibrary verbannt werden. Das liegt daran, daß auch in
Deinem Beispiel der vor der Tastatur sitzende Anwender den Speicher
überschreiben kann - er muss nur bei den scanf-Eingaben mehr als 29
Zeichen eintippen ...

Du solltest also in der Tat mit fgets ganze Zeilen einlesen, die auf
sinnvollen Inhalt überprüfen und dann erst ein sscanf darauf loslassen,
sofern das überhaupt nötig ist (hier genügt ein einfaches strncpy und
ein atoi).

Deine Funktion "Write" macht übrigens nicht ganz das, was Du
erwartest, zwar liest sie eingegebene Werte ein und speichert sie ...
aber eben nur in der lokalen Kopie der übergebenen Variablen. Deine
seltsamerweise "Read" benannte Funktion gibt niemals die in "Write"
eingelesenen Werte aus.

Lies Dir mal in einem guten C-Buch den Abschnitt über "call by
reference" und "call by value" durch, ich kann da guten Gewissens
die deutsche Übersetzung der zweiten Auflage des K&R ("Kernighan &
Ritchie", "Programmieren in C", Hanser Verlag) empfehlen.

Desweiteren:
C-Quelltext wird durch den Gebrauch von Einrückungen lesbarer.

von Dirk (Gast)


Lesenswert?

Scanf beendet bei einem Leerzeichen das Einlesen.

Verwende statt dessen die fgets-Funktion. Damit sind Leerzeichen kein
Problem mehr.

fgets(a.titel, sizeof(a.titel), stdin);

Als Übergabeparameter für Write-Funktion solltest du einen Zeiger
benutzen (Zeiger auf Stuktur).

von Ruedi Wiesendanger (Gast)


Lesenswert?

Kann mich meinen Vorrednern nur anschliessen und poste die
URL für eine kleine Einführung in C:

http://www.pronix.de/pronix-607.html

Dort sind die Beschränkungen von Scanf genau beschrieben:

<Quote>
Die Funktion scanf() liest zeichenweise eine Folge von Eingabefeldern
ein. Für jedes Eingabefeld muss eine Adresse vorhanden sein. Wobei das
Eingabefeld mit dem Datentyp der Adresse übereinstimmen muss. Bei
Erfolg liefert scanf() die Anzahl der erfolgreich eingelesenen Felder
zurück. Konnten keine Felder korrekt eingelesen werden, gibt scanf()
als Rückgabewert 0 zurück.

Folgende Zeichen werden bei scanf() als Eingabefelder akzeptiert:
-Alle Zeichen bis zum nächsten Whitespace
-Bis zu einer bestimmten Feldbreite von n-Zeichen
-Alle Zeichen bis zum ersten Zeichen, welches nicht mehr in ein
entsprechendes Format konvertiert werden konnte.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.