Re: wo ist itoa()?

From: Marc Santhoff <M.Santhoff(at)t-online.de>
Date: Mon, 15 Dec 2008 05:33:40 +0100

Am Montag, den 15.12.2008, 02:10 +0100 schrieb Harold Gutch:
> On Mon, Dec 15, 2008 at 01:17:35AM +0100, Patrick Hess wrote:
> > siehe Manpage), aber ein spezielles itoa() gibt es nicht. Man muß
> > dafür auf snprintf(3) zurückgreifen, quasi das Schweizer Messer für
> > so ziemlich jede Art von Konvertierungen:

Ah ja, jetzt erinnere ich mich.

> So weit stimme ich absolut zu, allerdings:
>
>
> > snprintf(string, strlen(string), "%i", integer);
> >
> > Wenn man das öfters benötigt, kann man sich ja ein Makro anlegen:
> >
> > #define itoa(i, s) snprintf((s), strlen((s)), "%i", (i));
>
> Vorsicht, falls "string" schon früh ein NUL-byte hat, bekommt man hier
> weniger als erwartet, etwa so:
>
> char *string = calloc(1, N);
> ...
> snprintf(string, strlen(string), "%i", i);
>
> Umgekehrt schreibt das Makro zu viel falls string nirgends ein
> NUL-byte enthält (auch nicht am Ende)!
>
> Falls string kein char * sondern ein char[N] array ist, leistet oben
> sizeof() anstatt strlen() das gewünschte. Ich würde aber nicht dazu
> raten, das Makro blind zu benutzen, da sizeof(char *) eine Konstante
> (4 bzw. 8) ist, in dem Fall also der 2. Parameter auch nicht den Wert
> hat den man eigentlich dort haben möchte. Letztenendes empfehle ich
> eher ich, das ganze immer "manuell" machen, also:
>
> char string[N];
> ...
> snprintf(string, sizeof(string), "%i", i);
>
> oder
>
> char *string = calloc(1, N);
> ...
> snprintf(string, N, "%i", i);

Und jetzt bin ich auch noch gewarnt. :)

Vielen Dank euch beiden,
Marc

To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Mon 15 Dec 2008 - 05:57:04 CET

search this site