Converting int to char in C

后端 未结 7 596
不知归路
不知归路 2021-01-18 03:55

Right now I am trying to convert an int to a char in C programming. After doing research, I found that I should be able to do it like this:

int value = 10;
c         


        
7条回答
  •  春和景丽
    2021-01-18 04:25

    Converting Int to Char

    I take it that OP wants more that just a 1 digit conversion as radix was supplied.


    To convert an int into a string, (not just 1 char) there is the sprintf(buf, "%d", value) approach.

    To do so to any radix, string management becomes an issue as well as dealing the corner case of INT_MIN


    The following C99 solution returns a char* whose lifetime is valid to the end of the block. It does so by providing a compound literal via the macro.

    #include 
    #include 
    #include 
    
    // Maximum buffer size needed
    #define ITOA_BASE_N (sizeof(unsigned)*CHAR_BIT + 2)
    
    char *itoa_base(char *s, int x, int base) {
      s += ITOA_BASE_N - 1;
      *s = '\0';
      if (base >= 2 && base <= 36) {
        int x0 = x;
        do {
          *(--s) = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[abs(x % base)];
          x /= base;
        } while (x);
        if (x0 < 0) {
          *(--s) = '-';
        }
      }
      return s;
    }
    
    #define TO_BASE(x,b) itoa_base((char [ITOA_BASE_N]){0} , (x), (b))
    

    Sample usage and tests

    void test(int x) {
      printf("base10:% 11d base2:%35s  base36:%7s ", x, TO_BASE(x, 2), TO_BASE(x, 36));
      printf("%ld\n", strtol(TO_BASE(x, 36), NULL, 36));
    }
    
    int main(void) {
      test(0);
      test(-1);
      test(42);
      test(INT_MAX);
      test(-INT_MAX);
      test(INT_MIN);
    }
    

    Output

    base10:          0 base2:                                  0  base36:      0 0
    base10:         -1 base2:                                 -1  base36:     -1 -1
    base10:         42 base2:                             101010  base36:     16 42
    base10: 2147483647 base2:    1111111111111111111111111111111  base36: ZIK0ZJ 2147483647
    base10:-2147483647 base2:   -1111111111111111111111111111111  base36:-ZIK0ZJ -2147483647
    base10:-2147483648 base2:  -10000000000000000000000000000000  base36:-ZIK0ZK -2147483648
    

    Ref How to use compound literals to fprintf() multiple formatted numbers with arbitrary bases?

提交回复
热议问题