【问题标题】:convert an integer number into an array将整数转换为数组
【发布时间】:2026-02-19 07:35:01
【问题描述】:

我正在尝试将 C 中的整数转换为包含该数字的每个数字的数组

即如果我有

int number = 5400

我怎么去

int numberArray[4]

在哪里

numberArray[0] = 0;
numberArray[1] = 0;
numberArray[2] = 4;
numberArray[3] = 5;

任何建议都非常感谢。

【问题讨论】:

    标签: c arrays


    【解决方案1】:

    这适用于数字 >= 0

    #include <math.h>
    
    char * convertNumberIntoArray(unsigned int number) {
        int length = (int)floor(log10((float)number)) + 1;
        char * arr = new char[length];
        int i = 0;
        do {
            arr[i] = number % 10;
            number /= 10;
            i++;
        } while (number != 0);
        return arr;
    }
    

    编辑:只是多一点 C 风格,但更神秘。

    #include <math.h>
    
    char * convertNumberIntoArray(unsigned int number) {
        unsigned int length = (int)(log10((float)number)) + 1;
        char * arr = (char *) malloc(length * sizeof(char)), * curr = arr;
        do {
            *curr++ = number % 10;
            number /= 10;
        } while (number != 0);
        return arr;
    }
    

    【讨论】:

    • 为什么这个函数是一个字符指针? new char[length] 有什么作用?它看起来像一个指向数组第一个索引的指针,但我的编译器似乎不喜欢'new char'
    • 'new char' 是 C++ 语言。在 C 语言中执行此操作的正确方法是第二段代码。
    • 另外,重要的是,在程序结束时,在从该函数返回的任何数组上调用 free()。否则你会泄漏内存。
    • 这不应该返回 int * 吗?
    • 可能但没有理由使用 4 字节 int 来存储 4 位数字。 Char 只是更紧凑的方式来做到这一点,尽管它可以很容易地替换为 int。
    【解决方案2】:

    提示:看看这个早先的问题“Sum of digits in C#”。它解释了如何使用几种方法提取数字中的数字,其中一些与 C 相关。

    来自Greg Hewgill's answer

    /* count number of digits */
    int c = 0; /* digit position */
    int n = number;
    
    while (n != 0)
    {
        n /= 10;
        c++;
    }
    
    int numberArray[c];
    
    c = 0;    
    n = number;
    
    /* extract each digit */
    while (n != 0)
    {
        numberArray[c] = n % 10;
        n /= 10;
        c++;
    }
    

    【讨论】:

    • 纯粹而简单!
    【解决方案3】:

    您可以使用对数而不是循环来计算整数中的位数。因此,

    int * toArray(int number)
    {
        int n = log10(number) + 1;
        int i;
        int *numberArray = calloc(n, sizeof(int));
        for ( i = 0; i < n; ++i, number /= 10 )
        {
            numberArray[i] = number % 10;
        }
        return numberArray;
    }
    

    【讨论】:

      【解决方案4】:

      试试这个,

      void initialise_array(int *a, int size, int num) {
          for (int i = 0; i < size; ++i, num /= 10)
              a[(size - 1) - i] = num % 10;
      }
      

      【讨论】:

        【解决方案5】:

        如果您需要考虑负数,您可能需要一些额外的逻辑。事实上,当你玩弄数组时,你不知道前期的大小,你可能想要做更多的安全检查,添加一个处理数据结构的 API 也很方便。

        // returns the number of digits converted
        // stores the digits in reverse order (smalles digit first)
        // precondition: outputdigits is big enough to store all digits.
        //
        int convert( int number, int* outputdigits, int* signdigit ) {
        
          int* workingdigits = outputdigits;
        
          int sign = 1;
          if( number < 0 ) { *signdigit = -1; number *= -1; }
          ++workingdigits;
        
          for ( ; number > 0; ++ workingdigits ) {
            *workingdigits = number % 10;
            number = number / 10;
          }
        
          return workingdigits - outputdigits;
        }
        
        void printdigits( int* digits, int size, int signdigit ) {
          if( signdigit < 0 ) printf( "-" );
        
          for( int* digit = digits+size-1; digit >= digits; --digit ){
            printf( "%d", *digit );
          }
        }
        
        int main() {
           int digits[10];
           int signdigit;
           printdigits( digits, convert( 10, digits, &signdigit ), signdigit );
           printdigits( digits, convert( -10, digits, &signdigit ), signdigit );
           printdigits( digits, convert( 1005, digits, &signdigit ), signdigit );
        
        }
        

        【讨论】:

        • 幸运的是,不需要负数。它是一个向上计数的小时计数器。不过,这个数字可能会变得非常大。
        【解决方案6】:
        #include <stdio.h>
        #include <string.h>
        
        int main(void)
        {
          int i, inputNumber;
          char* charArray;
        
          printf("\nEnter number: ");
          scanf("%d", &inputNumber);
        
          /* converts int to print buffer which is char array */
          sprintf(charArray, "%d", inputNumber); 
          int size = strlen(charArray);
        
          int intArray[size];
        
          for (i = 0; i < size; i++)
          {
            intArray[i] = charArray[i] - '0';
          }
        
          return 0;
        }
        

        【讨论】:

          【解决方案7】:

          C 代码:

          /* one decimal digit takes a few more than 3 bits. (2^3=8, 2^4=16) */
          int digits[(sizeof (int) * CHAR_BIT) / 3 + 1], 
              *digitsp = digits;
          do {
              *digitsp++ = number % 10;
              number /= 10;
          } while(number > 0);
          

          你会看到你通过取差转换了多少位数

          digitsp - digits
          

          如果你想把它放到一个函数中:

          #define MIN_DIGITS_IN_INT ((sizeof (int) * CHAR_BIT) / 3 + 1)
          
          int to_array(int number, int *digits) {
              int *digitsp = digits;
              do {
                  *digitsp++ = number % 10;
                  number /= 10;
              } while(number > 0);
              return digitsp - digits;
          }
          
          int main() {
              int number = rand();
              int digits[MIN_DIGITS_IN_INT];
              int n = to_array(number, digits);
          
              /* test whether we're right */
              while(n-- > 0) 
                  printf("%d", digits[n]);
              }
              printf(" = %d\n", number);
          }
          

          在这种情况下,我更喜欢自动数组而不是动态内存分配,因为这样做更容易正确并且不会意外泄漏。

          【讨论】:

          • “多于 3 位?”我想你刚刚赢得了某种措辞奖。
          • 是的,我觉得这听起来很奇怪 oO 让我改一下
          • 真棒不同的逻辑路径如何产生相同的结果:) 32 / 3 + 1 几乎与 log10(2 ** 32) + 1 == log2(2 ** 32) / log2( 10) + 1 == 32 / log2(10) + 1
          • 你能解释一下 MIN_DIGITS_IN_INT ((sizeof (int) * CHAR_BIT) / 3 + 1) 吗?
          • rajKumar,它需要是一个编译时间常数。所以我没有使用log10。您需要 3.32193 位来存储一位小数 (ld(10)) - 十个二进制决定。这意味着,您不能在 int 中存储超过 (sizeof (int) * CHAR_BIT)/3.32193 个位置,即 9.63296
          【解决方案8】:

          使用 vadim 的代码,我想出了这个测试程序:

          #include <stdio.h>
          #include <stdlib.h>
          #include <math.h>
          
          char * convertNumberIntoArray(unsigned int number) {
              unsigned int length = (int)(log10((float)number)) + 1;
              char * arr = (char *) malloc(length * sizeof(char)), * curr = arr;
              do {
                  *curr++ = number % 10;
                  number /= 10;
              } while (number != 0);
              return arr;
          }
          
          
          
          int main(void)
          {
              int InputNumber;
              int arr[5];
          
              printf("enter number: \n");
              scanf("%d", &InputNumber);
          
              convertNumberIntoArray(InputNumber);
          
              printf("The number components are: %d %d %d\n", arr[0],arr[1],arr[2]);
          
              system("PAUSE");    
              return 0;
          }
          

          但输出是垃圾。如果我在这里做了一些愚蠢的事情,谁能告诉我?

          /***** output *****/
          enter number:
          501
          The number components are: 2009291924 2009145456 -1
          Press any key to continue . . .
          

          --戴夫

          【讨论】:

          • 函数返回一个数组。你需要这个:char *arr; arr = convertNumberIntoArray(InputNumber); 注意arr 应该是char *,而不是int []。如果您希望它是 int *,您应该将函数更改为返回 int *,而不是 char *
          • 完成后不要忘记释放(arr)。或者,您可以使用@litb 方法并创建长度为 (32/3 + 1) == 11 的静态数组,然后将其填充。