ChatGPT解决这个技术问题 Extra ChatGPT

How to convert integer to string in C? [duplicate]

This question already has answers here: How to convert an int to string in C? (11 answers) Closed 9 years ago.

I tried this example:

/* itoa example */
#include <stdio.h>
#include <stdlib.h>

int main ()
{
    int i;
    char buffer [33];
    printf ("Enter a number: ");
    scanf ("%d",&i);
    itoa (i,buffer,10);
    printf ("decimal: %s\n",buffer);
    itoa (i,buffer,16);
    printf ("hexadecimal: %s\n",buffer);
    itoa (i,buffer,2);
    printf ("binary: %s\n",buffer);
    return 0;
}

but the example there doesn't work (it says the function itoa doesn't exist).

You should give more information, like the exact error message, what compiler you're using, and what OS.
my-itoa was already suggested somewhere else on SO.

q
qwertz

Use sprintf():

int someInt = 368;
char str[12];
sprintf(str, "%d", someInt);

All numbers that are representable by int will fit in a 12-char-array without overflow, unless your compiler is somehow using more than 32-bits for int. When using numbers with greater bitsize, e.g. long with most 64-bit compilers, you need to increase the array size—at least 21 characters for 64-bit types.


I tried running this program, and I got a runtime error. How can I get it to work properly? ideone.com/Xl21B4
@AndersonGreen The code here is correct. You typed it incorrectly. The error message tells you where.
sprintf is discussed here in more detail: stackoverflow.com/questions/8232634/simple-use-of-sprintf-c
Often it's better to use snprintf() to cover situations where you don't know how big str is going to be. (eg multi-byte characters, numbers that represent counters without a limit, etc).
R
Rory Mulvaney

Making your own itoa is also easy, try this :

char* itoa(int i, char b[]){
    char const digit[] = "0123456789";
    char* p = b;
    if(i<0){
        *p++ = '-';
        i *= -1;
    }
    int shifter = i;
    do{ //Move to where representation ends
        ++p;
        shifter = shifter/10;
    }while(shifter);
    *p = '\0';
    do{ //Move back, inserting digits as u go
        *--p = digit[i%10];
        i = i/10;
    }while(i);
    return b;
}

or use the standard sprintf() function.


To clarify: do while loops are used instead of while for when i is zero.
There's a bug in this code: it will fail when i = INT_MIN because of the i *= -1 line.
@Max, while tests the condition before the loop start, do while tests the condition after the loop has started.
@kasrak How to deal with that case. Is a larger type the only option?
c
cnicutar

That's because itoa isn't a standard function. Try snprintf instead.

char str[LEN];
snprintf(str, LEN, "%d", 42);

At least enough to hold the maximum value allowed by the integer type, I guess.
@Gabe I use (CHAR_BIT * sizeof(int) - 1) / 3 + 2, as caf mentioned.
you don't have to - 1 for snprintf.
snprintf() is safer in that you specify how much input you're taking. Otherwise, If your string has multi-byte characters, or ends up longer than you expected due to large numbers, you can overflow your buffer and crash your program (etc).