21.11.2013 Aufrufe

Eine Einführung in die Programmiersprache C und die Grundlagen ...

Eine Einführung in die Programmiersprache C und die Grundlagen ...

Eine Einführung in die Programmiersprache C und die Grundlagen ...

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 />

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 10.09.2009 14:23:00 Letzte Änderung am: 10. September 2009 Version 2.4.1, I. Oesch 23/147

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!