Converting integer to string in C without sprintf

后端 未结 5 1733
一向
一向 2020-12-17 03:56

It is possible to convert integer to string in C without sprintf?

相关标签:
5条回答
  • 2020-12-17 04:12
        int i = 24344; /*integer*/
        char *str = itoa(i); 
        /*allocates required memory and 
        then converts integer to string and the address of first byte of memory is returned to str pointer.*/
    
    0 讨论(0)
  • 2020-12-17 04:15

    There's a nonstandard function:

    char *string = itoa(numberToConvert, 10); // assuming you want a base-10 representation
    

    Edit: it seems you want some algorithm to do this. Here's how in base-10:

    #include <stdio.h>
    
    #define STRINGIFY(x) #x
    #define INTMIN_STR STRINGIFY(INT_MIN)
    
    int main() {
        int anInteger = -13765; // or whatever
    
        if (anInteger == INT_MIN) { // handle corner case
            puts(INTMIN_STR);
            return 0;
        }
    
        int flag = 0;
        char str[128] = { 0 }; // large enough for an int even on 64-bit
        int i = 126;
        if (anInteger < 0) {
            flag = 1;
            anInteger = -anInteger;
        }
    
        while (anInteger != 0) { 
            str[i--] = (anInteger % 10) + '0';
            anInteger /= 10;
        }
    
        if (flag) str[i--] = '-';
    
        printf("The number was: %s\n", str + i + 1);
    
        return 0;
    }
    
    0 讨论(0)
  • 2020-12-17 04:25

    Unfortunately none of the answers above can really work out in a clean way in a situation where you need to concoct a string of alphanumeric characters.There are really weird cases I've seen, especially in interviews and at work.

    The only bad part of the code is that you need to know the bounds of the integer so you can allocate "string" properly.

    In spite of C being hailed predictable, it can have weird behaviour in a large system if you get lost in the coding.

    The solution below returns a string of the integer representation with a null terminating character. This does not rely on any outer functions and works on negative integers as well!!

    #include <stdio.h>
    #include <stdlib.h>
    
    
    void IntegertoString(char * string, int number) {
    
       if(number == 0) { string[0] = '0'; return; };
       int divide = 0;
       int modResult;
       int  length = 0;
       int isNegative = 0;
       int  copyOfNumber;
       int offset = 0;
       copyOfNumber = number;
       if( number < 0 ) {
         isNegative = 1;
         number = 0 - number;
         length++;
       }
       while(copyOfNumber != 0) 
       { 
         length++;
         copyOfNumber /= 10;
       }
    
       for(divide = 0; divide < length; divide++) {
         modResult = number % 10;
         number    = number / 10;
         string[length - (divide + 1)] = modResult + '0';
       }
       if(isNegative) { 
       string[0] = '-';
       }
       string[length] = '\0';
    }
    
    int main(void) {
    
    
      char string[10];
      int number = -131230;
      IntegertoString(string, number);
      printf("%s\n", string);
    
      return 0;
    }
    
    0 讨论(0)
  • 2020-12-17 04:29

    You can use itoa where available. If it is not available on your platform, the following implementation may be of interest:

    https://web.archive.org/web/20130722203238/https://www.student.cs.uwaterloo.ca/~cs350/common/os161-src-html/atoi_8c-source.html

    Usage:

    char *numberAsString = itoa(integerValue); 
    

    UPDATE

    Based on the R..'s comments, it may be worth modifying an existing itoa implementation to accept a result buffer from the caller, rather than having itoa allocate and return a buffer.

    Such an implementation should accept both a buffer and the length of the buffer, taking care not to write past the end of the caller-provided buffer.

    0 讨论(0)
  • 2020-12-17 04:30

    Here's an example of how it might work. Given a buffer and a size, we'll keep dividing by 10 and fill the buffer with digits. We'll return -1 if there is not enough space in the buffer.

    int
    integer_to_string(char *buf, size_t bufsize, int n)
    {
       char *start;
    
       // Handle negative numbers.
       //
       if (n < 0)
       {
          if (!bufsize)
             return -1;
    
          *buf++ = '-';
          bufsize--;
       }
    
       // Remember the start of the string...  This will come into play
       // at the end.
       //
       start = buf;
    
       do
       {
          // Handle the current digit.
          //
          int digit;
          if (!bufsize)
             return -1;
          digit = n % 10;
          if (digit < 0)
             digit *= -1;
          *buf++ = digit + '0';
          bufsize--;
          n /= 10;
       } while (n);
    
       // Terminate the string.
       //
       if (!bufsize)
          return -1;
       *buf = 0;
    
       // We wrote the string backwards, i.e. with least significant digits first.
       // Now reverse the string.
       //
       --buf;
       while (start < buf)
       {
          char a = *start;
          *start = *buf;
          *buf = a;
          ++start;
          --buf;
       }
    
       return 0;
    }
    
    0 讨论(0)
提交回复
热议问题