Hi,
ich suche eine Funktion, der ich Format-Strings wie in printf() übergeben kann, die dann aber nicht auf den Bilschirm schreibt, sondern einen char * füllt...
Also, falls es sowas gibt, wär das echt cool...
Danke schon mal im Vorraus
Weissi
Funktion, die printf format-strings nimmt und einen char * zurückgibt?
Re: Funktion, die printf format-strings nimmt und einen char * zurückgibt?
gibt es:
sprintf( char *buffer, const char *format [, argument] ... );
grüße tom...
sprintf( char *buffer, const char *format [, argument] ... );
grüße tom...
Re: Funktion, die printf format-strings nimmt und einen char * zurückgibt?
Verdammt, 24 Sekunden... <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">
Re: Funktion, die printf format-strings nimmt und einen char * zurückgibt?
Hi!
Nimmt man da nicht besser asprintf()? Dadurch wird gleich ein entsprechender Puffer alloziert, wärend es sonst zu einem Überlauf kommen kann.
Cheers,
Wolfgang
Nimmt man da nicht besser asprintf()? Dadurch wird gleich ein entsprechender Puffer alloziert, wärend es sonst zu einem Überlauf kommen kann.
Cheers,
Wolfgang
Re: Funktion, die printf format-strings nimmt und einen char * zurückgibt?
Hi,
asprintf() funktioniert wohl auch, ist aber alles andere als portabel. Die Funktion existiert zwar in glibc, und möglicherweise auch in einigen anderen C-Libraries, aber sicher nicht in allen. Wenn das Programm eh nur unter Linux laufen soll, kann einem das natürlich egal sein, IMHO ist das aber ziemlich kurzsichtig..
CU,
Dominic
asprintf() funktioniert wohl auch, ist aber alles andere als portabel. Die Funktion existiert zwar in glibc, und möglicherweise auch in einigen anderen C-Libraries, aber sicher nicht in allen. Wenn das Programm eh nur unter Linux laufen soll, kann einem das natürlich egal sein, IMHO ist das aber ziemlich kurzsichtig..
CU,
Dominic
Re: Funktion, die printf format-strings nimmt und einen char * zurückgibt?
Hi!
Gibt es eine Möglichkeit, sicheren Code ohne diese Funktion zu schreiben? Ich kenn eldier keinen.
Klar, normal ist Portabilität Trumpf, aber ich würde im Zeifelsfall _funktionierenden_ Code gegenüber portablem dann doch vorziehen. Wer bewusst akzeptiert, dass sein Code unter Umständen segfaulten kann, der soll das tun, aber mit ist sprintf() "nicht gut genug".
Cheers,
Wolfgang
Gibt es eine Möglichkeit, sicheren Code ohne diese Funktion zu schreiben? Ich kenn eldier keinen.
Klar, normal ist Portabilität Trumpf, aber ich würde im Zeifelsfall _funktionierenden_ Code gegenüber portablem dann doch vorziehen. Wer bewusst akzeptiert, dass sein Code unter Umständen segfaulten kann, der soll das tun, aber mit ist sprintf() "nicht gut genug".
Cheers,
Wolfgang
Re: Funktion, die printf format-strings nimmt und einen char * zurückgibt?
Hi,
Wenn man sprintf() richtig einsetzt, lassen sich zumindest segfaults sicher verhindern, indem man z.B. bei allen Variablen die maximale Feldgröße mit angibt.
z.B.:
char buffer[256];
int n = ...;
char * str = ...;
...
sprintf (buffer, "Ein Integer: %5d\<!--no-->nEin String: %200s\<!--no-->n", n, str);
Egal wie groß der Wert von n ist, oder wie lang der String str ist, segfaulten wird das Programm nicht, das schlimmste was passieren kann, ist daß Teile des Integers oder des Strings abgeschnitten werden, wenn sie länger als 5 bzw. 200 Zeichen sind.
Davon abgesehen lässt sich eigentlich immer schon vor dem Aufruf von sprintf() feststellen wie groß der Puffer sein muss.
z.B.:
int n = ...;
char * str = ...;
char * format = "Ein Integer: %d\<!--no-->nEin String: %s\<!--no-->n";
...
char * buffer = (char*) malloc (strlen(format) + 11 + strlen(str) + 1);
sprintf (buffer, format, n, str);
Die Länge die der Puffer haben muß um ganz sicher zu gehen entspricht also der Summe aus
- Länge des Format Strings (genaugenommen könnte man hiervon noch das "%d" und das "%s" abziehen),
- Maximale Länge eines Integers (Zehnstellig plus evtl. Minuszeichen),
- Länge des Strings str,
- Null-Byte.
Ich hab's nicht getestet, solte aber funktionieren. Ich gebe zu daß asprintf() einfacher ist, aber sicherer ist es nicht, wenn man sprintf() vorsichtig verwendet.
CU,
Dominic
Wenn man sprintf() richtig einsetzt, lassen sich zumindest segfaults sicher verhindern, indem man z.B. bei allen Variablen die maximale Feldgröße mit angibt.
z.B.:
char buffer[256];
int n = ...;
char * str = ...;
...
sprintf (buffer, "Ein Integer: %5d\<!--no-->nEin String: %200s\<!--no-->n", n, str);
Egal wie groß der Wert von n ist, oder wie lang der String str ist, segfaulten wird das Programm nicht, das schlimmste was passieren kann, ist daß Teile des Integers oder des Strings abgeschnitten werden, wenn sie länger als 5 bzw. 200 Zeichen sind.
Davon abgesehen lässt sich eigentlich immer schon vor dem Aufruf von sprintf() feststellen wie groß der Puffer sein muss.
z.B.:
int n = ...;
char * str = ...;
char * format = "Ein Integer: %d\<!--no-->nEin String: %s\<!--no-->n";
...
char * buffer = (char*) malloc (strlen(format) + 11 + strlen(str) + 1);
sprintf (buffer, format, n, str);
Die Länge die der Puffer haben muß um ganz sicher zu gehen entspricht also der Summe aus
- Länge des Format Strings (genaugenommen könnte man hiervon noch das "%d" und das "%s" abziehen),
- Maximale Länge eines Integers (Zehnstellig plus evtl. Minuszeichen),
- Länge des Strings str,
- Null-Byte.
Ich hab's nicht getestet, solte aber funktionieren. Ich gebe zu daß asprintf() einfacher ist, aber sicherer ist es nicht, wenn man sprintf() vorsichtig verwendet.
CU,
Dominic
Last edited by das on 18. Jun 2001 21:58, edited 1 time in total.
Re: Funktion, die printf format-strings nimmt und einen char * zurückgibt?
Danke euch allen, die Community is einfach cool ))
Weissi
Weissi