将整数转换为数组

时间:2009-02-05 12:00:34

标签: c arrays

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

的数组

即。如果我有

int number = 5400

我怎样才能到达

int numberArray[4]

其中

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

感激地收到任何建议。

9 个答案:

答案 0 :(得分:14)

这适用于数字> = 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;
}

答案 1 :(得分:12)

提示:看一下之前的问题“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++;
}

答案 2 :(得分:7)

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

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;
}

答案 3 :(得分:1)

确定位数是很棘手的,但假设它总是4位数,你可以这样做:

for (i = 0; i < 4; i++) {
  numberArray[i] = number%10;
  number = number div 10;
}

答案 4 :(得分:1)

如果您需要考虑负数,则可能需要一些额外的逻辑。事实上,在玩数组时你不知道前期的大小,你可能想要做更多的安全检查,并且添加一个用于处理数据结构的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 );

}

答案 5 :(得分:1)

试试这个,

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

答案 6 :(得分:0)

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);
}

在这种情况下,我更喜欢自动数组到动态内存分配,因为它更容易正确执行而不会意外泄漏。

答案 7 :(得分:0)

使用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 . . .

- 戴夫

答案 8 :(得分:0)

#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;
}