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
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 />
6.2 E<strong>in</strong>lesen mit scanf():<br />
Die Funktion scanf() <strong>die</strong>nt gr<strong>und</strong>sätzlich zum (formatierten) E<strong>in</strong>lesen von Werten von der Tastatur<br />
(Genaugenommen liest <strong>die</strong> Funktion vom Standard-E<strong>in</strong>gabegerät [Standard Input, std<strong>in</strong>]).<br />
Die Funktion muss wissen, wo im Speicher sie den e<strong>in</strong>gelesenen Wert abspeichern soll, deshalb<br />
muss ihr <strong>die</strong> Adresse der Zielvariablen übergeben werden. Die Adresse der Variablen erhält man<br />
mit dem Operator &. Nur bei Str<strong>in</strong>gs wird direkt <strong>die</strong> Variable angegeben, da <strong>in</strong> e<strong>in</strong>er Str<strong>in</strong>gvariable<br />
bereits <strong>die</strong> Adresse des ersten Zeichens des Str<strong>in</strong>gs abgespeichert wird.<br />
Achtung, <strong>die</strong> Funktion liest nur so viele Zeichen wie sie benötigt, <strong>und</strong> lässt den Rest im E<strong>in</strong>gabepuffer.<br />
Sobald <strong>die</strong> Funktion auf e<strong>in</strong> Zeichen trifft welches sie nicht verarbeiten kann, bricht sie ab<br />
<strong>und</strong> belässt das Zeichen im E<strong>in</strong>gabepuffer. Deshalb sollte man den E<strong>in</strong>gabepuffer nach dem Aufruf<br />
von scanf() immer leeren. Die Funktion scanf()liefert <strong>die</strong> Anzahl der erfolgreich e<strong>in</strong>gelesenen<br />
Werte zurück. Variablen, <strong>die</strong> nicht e<strong>in</strong>gelesen werden konnten behalten ihren vorherigen Wert.<br />
Welche <strong>und</strong> wieviele Werte e<strong>in</strong>gelesen werden sollen, wird der Funktion mit e<strong>in</strong>em ähnlichen Formatstr<strong>in</strong>g<br />
wie bei pr<strong>in</strong>tf() angegeben. Die E<strong>in</strong>leseanweisungen beg<strong>in</strong>nen mit e<strong>in</strong>em %, <strong>die</strong> darauf<br />
folgenden Zeichen geben an, von welchem Typ der e<strong>in</strong>zulesende Wert ist, <strong>und</strong> welches Format<br />
<strong>die</strong> E<strong>in</strong>gabe hat.<br />
Wenn auf Formatierungen verzichtet wird, ergeben sich <strong>die</strong> folgenden Anweisungen:<br />
%c für Daten vom Typ char, liest e<strong>in</strong>en Buchstaben e<strong>in</strong>, speichert dessen ASCII-Code ab<br />
%d für Daten vom Typ <strong>in</strong>t, liest e<strong>in</strong>e ganze Zahl e<strong>in</strong> <strong>und</strong> speichert <strong>die</strong>se ab<br />
%hd für Daten vom Typ short, liest e<strong>in</strong>e ganze Zahl e<strong>in</strong> <strong>und</strong> speichert <strong>die</strong>se ab<br />
%ld für Daten vom Typ long, liest e<strong>in</strong>e ganze Zahl e<strong>in</strong> <strong>und</strong> speichert <strong>die</strong>se ab<br />
Für unsigned Typen ist das u anstelle von d e<strong>in</strong>zusetzen<br />
%u für Daten vom Typ unsigned <strong>in</strong>t, liest e<strong>in</strong>e ganze Zahl e<strong>in</strong> <strong>und</strong> speichert <strong>die</strong>se ab<br />
%hu für Daten vom Typ unsigned short, liest e<strong>in</strong>e ganze Zahl e<strong>in</strong> <strong>und</strong> speichert <strong>die</strong>se ab<br />
%lu für Daten vom Typ unsigned long, liest e<strong>in</strong>e ganze Zahl e<strong>in</strong> <strong>und</strong> speichert <strong>die</strong>se ab<br />
Wenn <strong>die</strong> E<strong>in</strong>gabe <strong>in</strong> hexadezimaler Notation erfolgen soll, muss x anstelle von d verwendet werden.<br />
(Die Zahl wird als unsigned betrachtet)<br />
%x für Daten vom Typ <strong>in</strong>t <strong>und</strong> unsigned <strong>in</strong>t<br />
%hx für Daten vom Typ short <strong>und</strong> unsigned short<br />
%lx für Daten vom Typ long <strong>und</strong> unsigned long<br />
Für Fliesskommazahlen gelten folgende Notationen:<br />
%f für Daten vom Typ float (ACHTUNG, anders als bei pr<strong>in</strong>tf() !!!)<br />
%lf für Daten vom Typ double (ACHTUNG, anders als bei pr<strong>in</strong>tf() !!!)<br />
%Lf für Daten vom Typ Long double<br />
Anstelle von f kann auch e oder g verwendet werden, das hat ke<strong>in</strong>en E<strong>in</strong>fluss auf <strong>die</strong> Art des E<strong>in</strong>lesens.<br />
Zum E<strong>in</strong>lesen von Str<strong>in</strong>gs muss %s benutzt werden, Achtung, bei Str<strong>in</strong>gvariablen darf der &-<br />
Operator nicht benutzt werden. Str<strong>in</strong>gs werden zudem nur bis zum ersten Whitespace (Leerzeichen,<br />
Tabulator, Zeilenvorschub...) gelesen. Mit %s können somit nur e<strong>in</strong>zelne Worte e<strong>in</strong>gelesen werden.<br />
Da scanf() wie erwähnt beim E<strong>in</strong>lesen unbenutzte Zeichen im Tastaturpuffer zurücklässt, sollte<br />
der Puffer vor dem nächsten E<strong>in</strong>lesen geleert werden (Oder <strong>die</strong> ganze Zeile mit gets() auf e<strong>in</strong>mal<br />
e<strong>in</strong>gelesen werden <strong>und</strong> erst anschliessend mit sscanf() konvertiert werden):<br />
scanf("%d", &i); /* E<strong>in</strong>lesen */<br />
while (getchar() != '\n') {}; /* Puffer leeren (Lesen bis Zeilenvorschub)*/<br />
Gedruckt am 11.09.2008 13:04:00 Letzte Änderung am: 11. September 2008 Version 2.4, I. Oesch 23/147