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.
"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.
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).
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.