Robert Bienert: String concat in c++

Beitrag lesen

Moin!

sprintf(dateiname,"%s,%d,%f",hans,i,my_float);
Astreiner Speicherzugriffsfehler.

wenn man mal von den syntaktischen Fehlern [...] und den Schreibfehlern bei den Variablennamen [...] absieht, ist das eigentlich okay.

Nein, ist es nicht. Du willst nicht wirklich sprintf in deinem Code verwenden, sondern snprintf.

Vorausgesetzt, dateiname ist groß genug dimensioniert, um alle gewünschten Daten, vor allem den String, aufzunehmen.

Ich zitiere hier aus der BSD Library Functions Manual über sprintf(3):

SECURITY CONSIDERATIONS

The sprintf() and vsprintf() functions are easily misused in a manner which enables malicious users to arbitrarily change a running program's functionality through a buffer overflow attack.  Because sprintf() and vsprintf() assume an *infinitely long string*, callers must be careful not to overflow the actual space; this is often hard to assure.  For safety, programmers should use the snprintf() interface instead.

Also wo siehst du hier den kapitalen Bock?

Das sprintf halt – wie genannt – davon ausgeht, dass dein Puffer im Zweifelsfall unendlich groß ist. Deshalb will man z.B. auch gets nicht benutzen, sondern fgets(buffer, buffsize, stdin) stattdessen.

Viele Grüße,
Robert