====== scanf() ====== ''scanf()'' ist in der ''[[c:lib:stdio:start|stdio]]'' definiert, die in C über ''stdio.h'', bzw in C++ über ''cstdio'' eingebunden wird. ===== Funktion ===== ''scanf()'' wird dazu verwendet, um einen String aus einem Standardeingabestream zu interpretieren und in Variablen abzulegen, wie es über einen [[FormatString]] beschrieben ist. ===== Signatur ===== #include int scanf( char const * formatString, ... ); **formatString**: [[Formatstring]], der beschreibt, wie der zu parsende String zusammengesetzt ist \\ **...**: Eine Anzahl von Argumenten, entsprechend des Formatstrings \\ \\ **Return Value**: Die Länge der geparsten Zeichen aus dem Eingabestring. ===== Fehlerquellen ===== Der Eingabestring muss dem Formatstring entsprechen. ''scanf()'' liest von der Standardeingabe, was gerade bei Anfängerprogrammen in der Regel die Tastatur ist. Gibt der Benutzer die Daten nicht genau in dem Format ein, wie es dem Formatstring entspricht, führt dies zu willkürlichen Ergebnissen. Da der Entwickler den Benutzer nicht kontrollieren kann, kann man nicht davon ausgehen, dass die Eingaben einen Sinn ergeben. Entsprechend gefährlich ist die Verwendung von ''scanf()''.\\ Im nachfolgenden Beispiel wird ein String eingelesen, ist dieser String länger als der Zwischenspeicher, so kann das Programm abstürzen. Weiterhin darf der String keine Leerzeichen enthalten, da diese als Trennsymbole zwischen mehreren Strings darstellt. Für Eingaben sollte entweder eine [[gui:start|GUI]] oder [[c:func:main:parameter|Parameter]] verwendet werden. Bei Einsteigern ist es besonders beliebt, Parameter wie in [[printf]] zu übergeben. Es werden jedoch die Adressen der Variablen benötigt. Die Variablen müssen also mit dem vorangestellten AddressOf-Operator (&variable) übergeben werden, sofern es keine Zeigervariablen sind, die bereits auf den zu beschreibenden Speicherplatz zeigen. Bei Eingaben von der Tastatur entstehen häufig Probleme dadurch, dass ''scanf()'' wie [[printf]] mit abschließendem Newline verwendet wird. char text[]="Hello World\n"; printf( "%s\n", text ); scanf( "%s\n", text ); Hier ist darauf zu achten, dass das Newline (''\n'') zu unerwartetem Verhalten führen kann. ===== Beispiel ===== #include #include int main() { int i = 0; char string[16]; printf( "Bitte geben Sie einen String ein: " ); fflush( stdout ); scanf( "%s", &string[0] ); // Adresse des ersten Buchstabens printf( "Sie gaben folgenden String ein: %s\n", string ); printf( "Bitte geben Sie einen Integer ein: "); fflush( stdout ); scanf( "%i", &i ); // Adresse von i printf( "Sie gaben folgenden Integer ein: %d\n", i ); return EXIT_SUCCESS; } **Ausgabe**: Bitte geben Sie einen String ein: proggen.org Sie gaben folgenden String ein: proggen.org Bitte geben Sie einen Integer ein: 42 Sie gaben folgenden Integer ein: 42 ===== siehe auch ===== [[c:lib:stdio:start|stdio]]: [[c:lib:stdio:vscanf()]], [[c:lib:stdio:fscanf()]], [[c:lib:stdio:vfscanf()]], [[c:lib:stdio:sscanf()]], [[c:lib:stdio:gets()]], [[c:lib:stdio:fread()]]