New 'n' Improved comp.lang.c FAQ List
Matthew J. Newhook
matthew1 at garfield.cs.mun.ca
Sat Apr 6 00:55:33 AEST 1991
paul at sequoia.cray.com (Paul Dow (CRI-UK)) writes:
>Will this never end..... Here's my three ha'pence....
>In article <1991Apr4.024300.19969 at garfield.cs.mun.ca>, matthew1 at garfield.cs.mun.ca (Matthew J. Newhook) writes:
[ stuff deleted .. ]
>|> Actually here is a correct (portable) version (assuming that you want to
>|> keep a static character buffer, and not use a newly malloc'd one each time).
>|>
>|> #include <math.h>
>|>
>|> char *itoa(int i)
>|> {
>|> static int first = 1;
>|> static char *s;
>|>
>|> if (first) { /* IF FIRST TIME ALLOCATE MEMORY FOR STRING */
>|> first = 0;
>|> s = (char *)
>|> malloc((long) ceil(log10(pow(2, (double) sizeof(int) * 8))) +1);
>|> if (!s) {
>|> fprintf(stderr,"malloc failed\n");
>|> exit(1);
>|> }
>|> }
>|>
>|> sprintf(s, "%d", i);
>|> return s;
>|> }
>|>
>|> This is portable, 'cause it always assigns the correct value to the size of
>|> the array, without depending on the sizeof(int) == 2.
>|>
>|> Matthew Newhook
>|>
>It is easy to say that things are "correct" & "portable". How often have
>people been flamed in this newsgroup (and others) for that. A lot of people
>are put of replying to questions for fear of being flamed. Mind you, if
>the replies were framed as suggestions as opposed to "correct"/"portable" etc,
>then they would not irritate the "flamer" so much.
>Anyhow, enough of that sideline, let us look at the last example above and ask
>a few questions ?
>Q1) The "*8" I presume is for the numbers of bits in a byte. Are there
> problems here on a 9 bit machine? I don't have access to any such machines, so I cannot test this out.
>Q2) Should the first parameter to pow() be a double - the compiler may not
> support prototypes.
I'm using ANSI C, and the standard says pow takes double.
>Q3) The "+1" appears to be for the terminating NULL character. Has any
> space being allowed for a leading "-" sign ?
woops...
>Q4) Malloc is being passed a "long" type for the number of bytes. Should
> this be an unsigned (int) [it is on my SunOS 4.1 system].
Should actually be size_t according to the standard.
>Q5) If the malloc fails, then a string is written to stderr. Is this
> accetable? Is it also acceptable to exit at that point ?
> This may not be acceptable to some applications which might not support a
> stderr per se ["stderr" might exist, but is it valid to use it ?].
> I have encountered this problem with assrted C libraries on several
> systems.
It was acceptable for this example...
> I have to admit that it is good to see return values checked. Code that
> ignores return values is the bane of my life.
>Suggestions:
>Here are a few things that I would think about. They would not change the functionality, but may be worth considering - depending on ones viewpoint.
>S1) I would tend to use a NULL/not NULL test for the pointer to determine if
> the buffer needed to be allocated.
This is a moot point, IMHO. "if (!p)" is a common enough expression...
>S2) It took a bit of thinking about to work out what the
> malloc((long) ceil(log10(pow(2, (double) sizeof(int) * 8))) +1);
> was doing. Can this be simplified ?
I don't know can it? Any ideas anyone?
>S3) It took me a second or two to work out where the result of the malloc was
> going. It would have helped me of the malloc line was indented more.
> Possibly, but where else was the malloc going?
Actually, I think someone posted a better solution to mine later...
It went like this, if your limits.h defines INT_MIN in the right manner...
(ie. -2147483648 instead of (1 << 31) or whatever). And, of course, you
use ANSI C.
#include <limits.h>
#define QUOTE(a) #a
char *itoa(int i)
{
static char retbuf[sizeof(QUOTE(INT_MIN)];
^^^^^^^^ shouldn't there be a +1 here for the null char?
/*
* I *think* the above is a legitimate use of sizeof. Can
* any standard gurus confirm or deny this?
*/
(void) sprintf(retbuf, "%d", i);
return retbuf;
}
Aid. (adrian at gonzo.mti.com)
>Paul.
>[All disclaimers may be assumed]
Matthew Newhook
--
----------------matthew1 at garfield.cs.mun.ca
"Living in the limelight; the universal dream for those who wish to
seem. Those who wish to be must put aside the alienation, get on with
the facination, the real relation, the underlying theme" - Rush
More information about the Comp.lang.c
mailing list