mikrocontroller.net

Forum: PC-Programmierung C-Programm


Autor: Hans Körber (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Ruedi Wiesendanger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.