06.10.2013 Aufrufe

Eine Einführung in die Programmiersprache C und ... - C /C++ Ecke

Eine Einführung in die Programmiersprache C und ... - C /C++ Ecke

Eine Einführung in die Programmiersprache C und ... - C /C++ Ecke

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

<strong>E<strong>in</strong>e</strong> <strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>die</strong> Informatik <strong>und</strong> <strong>die</strong> <strong>Programmiersprache</strong> C<br />

19.5.3 Formatierte E<strong>in</strong>gabe<br />

Die scanf-Funktionen behandeln E<strong>in</strong>gabe-Umwandlungen unter Formatkontrolle.<br />

<strong>in</strong>t fscanf(FILE *stream, const char *format, ...)<br />

fscanf liest von stream unter Kontrolle von format <strong>und</strong> legt umgewandelte<br />

Werte mit Hilfe von nachfolgenden Argumenten ab, <strong>die</strong> alle Zeiger se<strong>in</strong><br />

müssen. Die Funktion wird beendet, wenn format abgearbeitet ist. fscanf<br />

liefert EOF, wenn vor der ersten Umwandlung das Dateiende erreicht wird<br />

oder e<strong>in</strong> Fehler passiert; andernfalls liefert <strong>die</strong> Funktion <strong>die</strong> Anzahl der umgewandelten<br />

<strong>und</strong> abgelegten E<strong>in</strong>gaben.<br />

<strong>in</strong>t scanf(const char *format, ...) scanf(...) ist äquivalent zu fscanf(std<strong>in</strong>,...).<br />

<strong>in</strong>t sscanf(const char *s, const char *format, ...)<br />

sscanf(s, ...) ist äquivalent zu scanf(...), mit dem Unterschied, dass <strong>die</strong> E<strong>in</strong>gabezeichen<br />

aus der Zeichenkette s stammen. (Liest aus e<strong>in</strong>em Str<strong>in</strong>g, anstelle<br />

e<strong>in</strong>es Streams, so können Str<strong>in</strong>gs umgewandelt werden. Die Komb<strong>in</strong>ation<br />

gets(Buffer); sscanf(Buffer, ...) ist e<strong>in</strong>facher um<br />

Fehle<strong>in</strong>gaben abzufangen.)<br />

Die Format-Zeichenkette enthält normalerweise Umwandlungsangaben, <strong>die</strong> zur Interpretation der E<strong>in</strong>gabe verwendet<br />

werden. Die Format-Zeichenkette kann folgendes enthalten:<br />

Leerzeichen oder Tabulatorzeichen, <strong>die</strong> ignoriert werden.<br />

Gewöhnliche Zeichen (nicht aber %), <strong>die</strong> dem nächsten Zeichen nach Zwischenraum im E<strong>in</strong>gabestrom entsprechen<br />

müssen. Sie def<strong>in</strong>ieren so e<strong>in</strong>e E<strong>in</strong>gabemaske. (scanf("(%d)", &i) z. B. akzeptiert nur E<strong>in</strong>gabewerte,<br />

<strong>die</strong> <strong>in</strong> Klammern stehen, der Benutzer muss also auch <strong>die</strong> Klammern e<strong>in</strong>tippen!!)<br />

Umwandlungsangaben, bestehend aus e<strong>in</strong>em %; e<strong>in</strong>em optionalen Zeichen *, das <strong>die</strong> Zuweisung an e<strong>in</strong> Argument<br />

verh<strong>in</strong>dert; e<strong>in</strong>er optionalen Zahl, welche <strong>die</strong> maximale Feldbreite festlegt; e<strong>in</strong>em optionalen Buchstaben h,<br />

l, oder L, der <strong>die</strong> Länge des Ziels beschreibt; <strong>und</strong> e<strong>in</strong>em Umwandlungszeichen.<br />

<strong>E<strong>in</strong>e</strong> Umwandlungsangabe bestimmt <strong>die</strong> Umwandlung des nächsten E<strong>in</strong>gabefelds. Normalerweise wird das Resultat <strong>in</strong><br />

der Variablen abgelegt, auf <strong>die</strong> das zugehörige Argument zeigt. Wenn jedoch * <strong>die</strong> Zuweisung verh<strong>in</strong>dern soll, wie bei<br />

%*s, dann wird das E<strong>in</strong>gabefeld e<strong>in</strong>fach übergangen <strong>und</strong> e<strong>in</strong>e Zuweisung f<strong>in</strong>det nicht statt. E<strong>in</strong> E<strong>in</strong>gabefeld ist als Folge<br />

von Zeichen def<strong>in</strong>iert, <strong>die</strong> ke<strong>in</strong>e Zwischenraumzeichen s<strong>in</strong>d; es reicht entweder bis zum nächsten Zwischenraumzeichen,<br />

oder bis e<strong>in</strong>e explizit angegebene Feldbreite erreicht ist. Daraus folgt, dass scanf über Zeilengrenzen h<strong>in</strong>weg liest,<br />

um se<strong>in</strong>e E<strong>in</strong>gabe zu f<strong>in</strong>den, denn Zeilentrenner s<strong>in</strong>d Zwischenraumzeichen. (Zwischenraumzeichen s<strong>in</strong>d Leerzeichen,<br />

Tabulatorzeichen \t, Zeilentrenner \n, Wagenrücklauf \r, Vertikaltabulator \v <strong>und</strong> Seitenvorschub \f).<br />

Das Umwandlungszeichen gibt <strong>die</strong> Interpretation des E<strong>in</strong>gabefelds an. Das zugehörige Argument muss e<strong>in</strong> Zeiger se<strong>in</strong>.<br />

Den Umwandlungszeichen d, i, n, o, u <strong>und</strong> x kann h vorausgehen, wenn das Argument e<strong>in</strong> Zeiger auf short statt <strong>in</strong>t<br />

ist, oder der Buchstabe l, wenn das Argument e<strong>in</strong> Zeiger auf long ist. Vor den Umwandlungszeichen e, f <strong>und</strong> g kann<br />

der Buchstabe l stehen, wenn e<strong>in</strong> Zeiger auf double <strong>und</strong> nicht auf float <strong>in</strong> der Argumentenliste steht, <strong>und</strong> L, wenn<br />

es sich um e<strong>in</strong>en Zeiger auf long double handelt.<br />

Aufbau (Ohne Leerzeichen dazwischen, alles ausser dem Umwandlungszeichen kann weggelassen werden):<br />

% Stern(*) Feldbreite(Zahl) Modifier(l, L oder h) Umwandlungszeichen<br />

Achtung, scanf(...) lässt alle nicht verwertbaren Zeichen im E<strong>in</strong>gabepuffer stehen, der E<strong>in</strong>gabepuffer sollte deshalb vor<br />

dem nächsten Aufruf von scanf() geleert werden, sonst wird scanf() zuerst <strong>die</strong> verbliebenen Zeichen umzuwandeln<br />

versuchen. Wenn <strong>die</strong> Zeichen erneut für <strong>die</strong> geforderte E<strong>in</strong>gabe nicht verwendbar s<strong>in</strong>d, verbleiben sie weiterh<strong>in</strong> im<br />

E<strong>in</strong>gabepuffer. So kann e<strong>in</strong> ungültiges Zeichen im E<strong>in</strong>gabepuffer jeden weiteren E<strong>in</strong>lesevorgang blockieren, solange es<br />

nicht aus dem Puffer entfernt wird (Z. B. mit getchar() oder gets()).<br />

Beispiele für sicheren scanf()-E<strong>in</strong>satz<br />

/* E<strong>in</strong>lesen mit anschliessendem Pufferleeren */<br />

scanf("%d", &i); /* E<strong>in</strong>lesen */<br />

while (getchar() != '\n') {}; /* Puffer leeren */<br />

/* E<strong>in</strong>lesen mit gets() <strong>und</strong> scanf() */<br />

char Buffer[200] /* Nur sicher wenn E<strong>in</strong>gabe nicht laenger als 200 Zeichen */<br />

gets(Buffer);<br />

sscanf(Buffer, "%d", &i); /* E<strong>in</strong>lesen */<br />

Gedruckt am 11.09.2008 13:04:00 Letzte Änderung am: 11. September 2008 Version 2.4, I. Oesch 77/147

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!