1

Pulling my hair out here, but I need to convert an int to a string in C without using snprintf or itoa. Any suggestions?

I tried using:

/*
**  LTOSTR.C -- routine and example program to convert a long int to
**  the specified numeric base, from 2 to 36.
**
**  Written by Thad Smith III, Boulder, CO. USA  9/06/91 
**  and contributed to the Public Domain.
**  
**  src: http://www8.cs.umu.se/~isak/snippets/ltostr.c
*/

#include <stdlib.h>

char *                  /* addr of terminating null */
ltostr (
    char *str,          /* output string */
    long val,           /* value to be converted */
    unsigned base)      /* conversion base       */
{
    ldiv_t r;           /* result of val / base */

    if (base > 36)      /* no conversion if wrong base */
    {
        str = '\0';
        return str;
    }
    if (val < 0)    *str++ = '-';
    r = ldiv (labs(val), base);

    /* output digits of val/base first */

    if (r.quot > 0)  str = ltostr (str, r.quot, base);

    /* output last digit */

    *str++ = "0123456789abcdefghijklmnopqrstuvwxyz"[(int)r.rem];
    *str   = '\0';
    return str;
}

...but it gives me a EXE_BAD_ACCESS on *str++ = "0123456789abcdefghijklmnopqrstuvwxyz"[(int)r.rem];.

Snyex
  • 91
  • 6
Ash
  • 24,276
  • 34
  • 107
  • 152
  • 1
    You might get some clues from my question: http://stackoverflow.com/questions/4351371/c-performance-challenge-integer-to-stdstring-conversion The answers all use some C++, but the underlying approaches work in C as well. – Ben Voigt May 23 '11 at 00:23
  • How are you calling `ltostr()`? – sarnold May 23 '11 at 00:24
  • actually, it seems like this code does work after all. Sorry. – Ash May 23 '11 at 00:29
  • There is a implementation for itoa here : http://www.opensource.apple.com/source/groff/groff-12/groff/libgroff/itoa.c – Waxhead May 23 '11 at 00:35
  • 1
    Note that the code shown fails badly on LONG_MIN (on machines that use a 2's-complement representation for integers). – Jonathan Leffler May 23 '11 at 04:02

1 Answers1

3

I'm guessing you're not allocating any memory.

str needs to be a pointer to a block of allocated memory sufficiently large enough to fit the string being created by the function.

This function doesn't allocate any memory. You need to do that before you call the functio, and then pass the pointer in.

Andrew Cooper
  • 32,176
  • 5
  • 81
  • 116