16.23 Formatiert in einen String schreiben und formatiert aus einem String lesen – »sscanf()« und »sprintf()« 

Die Funktion sprintf() ist in der Headerdatei <stdio.h> deklariert und nicht – wie häufig irrtümlicherweise angenommen – in <string.h>. Sie arbeitet genauso wie printf(), nur dass statt der Ausgabe auf dem Bildschirm formatiert in einen String geschrieben wird. So lassen sich verschiedene Formatelemente formatiert in einen String schreiben. Die Syntax dazu lautet:
int sprintf( char * restrict target_string, const char * restrict format, ...); int snprintf( char * restrict target_string, size_t n const char * restrict format, ...);
Mit dem ersten Parameter target_string wird die Adresse des Zielstrings angegeben. Das zweite und die weiteren Argumente von sprintf() haben dieselbe Bedeutung wie schon bei der Funktion printf(). snprintf() funktioniert genauso wie sprintf(), nur werden hierbei nicht mehr als n Bytes in den Zielstring target_string geschrieben.
Diese Funktion eignet sich besonders gut, wenn Sie Zahlen in einen String konvertieren wollen. Zudem schreibt sie am Ende das '\0'-Zeichen. Dazu ein kurzes Listing:
/* sprint.c */ #include <stdio.h> #include <stdlib.h> #define BUF 255 int main(void) { char string1[BUF]; char string2[BUF]; int anzahl = 10; char gegenstand[] = "Kartoffel"; float liter = 1.55f; char fluessigkeit[] = "Limo"; sprintf(string1, "%d kg %s\n",anzahl,gegenstand); sprintf(string2, "%.2f Liter %s\n",liter,fluessigkeit); printf("%s",string1); printf("%s",string2); return EXIT_SUCCESS; }
Abbildung 16.9 Formatiert in einen String schreiben
Die Funktion sscanf() stellt das Gegenstück zur Funktion sprintf() dar. Sie funktioniert genauso wie scanf(), nur liest sscanf() die Formatelemente nicht von der Tastatur ein, sondern von einem String. Die Syntax sieht so aus:
int sscanf( const char * restrict quell_string, const char * restrict format, ...);
Im ersten Argument befindet sich der Quellstring, von dem anschließend die Eingabezeichen mit den Formatbezeichnern des zweiten Arguments in die Variablenliste eingelesen werden. Am Dateiende oder bei einem Fehler gibt diese Funktion EOF zurück. Damit können Strings wieder in Zahlen umgewandelt werden. Hier sehen Sie ein Beispiel zu sscanf():
/* sscanf.c */ #include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc, char **argv) { int count = 1, check, temp, summe = 0; if (argc < 2) { fprintf(stderr, "Verwendung: %s Integer" " Integer [Integer_n]\n", *argv); return EXIT_FAILURE; } while(count < argc) { /* einzelne Argumente in Integerwerte konvertieren */ check = sscanf(argv[count], "%d", &temp); /* ungültiges Argument wird ignoriert */ if(check == EOF) count++; else { summe += temp; count++; } } printf("Summe aller Ganzzahlen der Argumente: %d\n", summe); return EXIT_SUCCESS; }
Mit diesem Listing werden die Ganzzahlen, die dem Programm beim Aufruf über die Kommandozeile als Argumente mitgegeben wurden, als Summe berechnet. Die einzelnen Argumente werden mit der folgenden Zeile in Integerwerte konvertiert:
check = sscanf(argv[count], "%d", &temp);
Zur Verdeutlichung folgt hier noch ein weiteres Beispiel mit den beiden Funktionen sprintf() und sscanf():
/* form.c */ #include <stdio.h> #include <stdlib.h> #define NUMITEMS 4 char *namen[4] = { "Jürgen", "Fatma", "Gismo", "Jonathan" }; int main(void) { int schleife; char temp[4][80]; char name[20]; int alter; long lohn; /* Wir erstellen Namen, Alter und Gehalt. Alter und Gehalt * werden durch Zufallszahlen erzeugt. Mit sprintf schreiben * wir die Daten formatiert nach int temp. */ for (schleife = 0; schleife < NUMITEMS; ++schleife) sprintf(temp[schleife], "%s %d %ld" ,namen[schleife], rand()%20+18, rand()+27500L); /* Wir erstellen eine Kopfzeile. */ printf("%4s | %-20s | %5s | %9s\n", "#","Name","Alter","Gehalt"); printf(" ----------------------------------------" "----------\n"); /* Mit sscanf lesen wir die Daten formatiert aus temp aus, * und zwar dort, wo wir zuvor mit sprintf die Daten * formatiert geschrieben haben. */ for (schleife=0; schleife < NUMITEMS; ++schleife) { sscanf(temp[schleife],"%s %d %ld",(char*)&name,&alter,&lohn); printf("%4d | %-20s | %5d | %9ld\n", schleife+1,name,alter,lohn); } return EXIT_SUCCESS; }
Abbildung 16.10 Formatiertes Schreiben in einen und Lesen aus einem String
Dies ist ein recht praktisches Beispiel. Zuerst wird mit sprintf() formatiert in das zweidimensionale Array temp geschrieben und anschließend mit sscanf() wieder formatiert ausgelesen.
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.