Formatierte Ein-/Ausgabe mit >>scann()<< und >>printf()<< Flashcards

1
Q

Welcher include/headerdatei wird für den Befehl
~~~
scanf();
~~~
benötigt?

A
<stdio.h>
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Wie ist die Signatur von scanf();

A
int scanf(const char * restrict format, ...);
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Was macht die Funktion scanf(); ?

A

Mit ihr können Werte unterschiedlicher Datentypen formatiert eingelesen werden.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Aus welcher Quelle werden die Daten bei scanf(); eingelesen?

A

Von der Standarteingabe (stdin)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Was ist normalerweise die Standarteingabe (stdin) ?

A

Mit Standarteingabe ist normalerweise die Tastatur gemeint.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Kann man die Standarteingabe auch umleiten?

A

Ja

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Was ist ein Beispiel für die Umleitung der Standarteingabe (stdin) ?

A

Beim Raspberry Pi wird das oft gemacht, wenn dieser ohne Monitor (headless) betrieben wird. Dann wird der z.B. mit einem PC per Telnet oder serieller Schnitstelle verbunden und in stdin erscheinen auf dem Paspberry Pi die Zeichen, die der PC sendet.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Welche Paramter müssen bei scanf(); verwendet werden?

A

Der erste Paramter ist ein String mit den Formatzeichen der Datentypen, die eingeselen werden sollen. Danach kommen die Speicheradressen der Variablen, in die die eingelesen Werte geschreiben werden sollen. Es können auch nicht Formatzeichen im String angegeben werden. Diese werden bei der Eingabe dann ignoriert.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

In welche Einzelteile kann eine Variable zerlegt werden:

A
  • Datentyp
  • Name der Variable
  • Speicheradresse der Variable
  • Wert der Variable
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Was macht der &-Operator

A

Er gibt die Speicheradresse der Variable zurück.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Was ist das Problem mit der Pufferung bei scanf(); ?

A

Wenn z.B. mit scanf(); ein Char eingelesen werden soll und man die Eingabe mit Enter bestätigt, so bleibt das Enter im Puffer der Standarteingabe und wird in die nächste eingabe geschrieben

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Pufferproblem bei scanf - Lösungsvorschlag 1

A

Die Funktion fflush() um Entleeren des puffers benutzen:
~~~
fflush(stdin);
~~~

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Pufferproblem bei scanf - Lösungsvorschlag 2

A

Benutzen einer do while-Schleife um das Newline-Zeichen aus dem Puffer zu ziehen:
~~~
do {scanf(“%c”, &a);} while (getchar() != ‘\n’ };
~~~

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Pufferproblem bei scanf - Lösungsvorschlag 3

A

Nicht scanf() verwenden, sondern fgets() zum Einlesen verwenden und sscanf() verwenden um in das entsprechende Format zu konviertieren.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Warum sind scanf() und printf() sicherheitskritische Funktionen

A

Weil sie nicht gegen eine Buffer Overflow gesichert sind, heißt sie prüfen nicht ob die eingabe vielleicht zu groß ist. Ab C23 sollen sie dejoch gegen Buffer Overflows abgesichert sein.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Wie kann ein Hacker ein Buffer Overflow ausnutzen

A

Wenn nicht auf Buffer Overflow geprüft wird, können so Daten auserhalb des Buffers überschrieben werden.

17
Q

Wie kann ich überprüfen ob die Eingaben alle eingelesen wurden.

A

scanf() gibt die Zahl der erfolgreich eingelesen Werte zurück. Sollte kein Wert erflogreich eingelesen werden wird der Wert 0 zurückgegeben. Wenn ein Wert nicht erfolgreich eingelesen wurde werden die andere auch nicht mehr probiert.

18
Q

Was passiert wenn bei der Eingabe schon ein Fehler auftrit

A

Es wird das EOF-Zeichen zurückgegeben.

EOF-Zeichen ist systemabhängig

19
Q

Wann hört scanf() auf Werte in eine Variable einzulesen?

A
  • bis zum nächsten Whitespace
  • bis zu einer bestimmten Feldbreite
  • bis zum ersten Zeichen, das nicht merh in ein entsprechndes Format konvertiert werden konnte.
20
Q

Was ist der Rückgabewert von printf()

A

Anzahl der Zeichen die ausgegeben werden oder im Fehlerfall EOF.

21
Q

Begrenzte länge des Formatstrings

A

Auch mit printf() kann es einen Buffer Overflow geben, sollte der Formatstring länger sein als erlaubt. Nach C99-Standart würde printf() nach 4096 Zeichen Probleme bekommen.

22
Q

Kann man die Standardausgabe (stdout) auch umleiten?

A

Ja