преобразовать целочисленное число в массив

Я пытаюсь преобразовать целое число в C в массив, содержащий каждую из цифр этого числа

т.е. если у меня есть

int number = 5400 

Как я могу добраться до

 int numberArray[4] 

где

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

Любые предложения с благодарностью получили.

Это будет работать для чисел> = 0

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

EDIT: Только немного больше C-стиля, но более загадочно.

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

Подсказка: взгляните на этот ранний вопрос « Сумма цифр в C # ». В нем объясняется, как извлекать цифры в числе, используя несколько методов, некоторые из которых относятся к C.

Из ответа Грега Хьюглилла :

 /* 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++; } 

Вы можете рассчитать количество цифр в целых числах с логарифмом, а не в цикле. Таким образом,

 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 цифры, которые вы можете сделать:

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

Если вам нужно учитывать отрицательные числа, вам может потребоваться дополнительная логика. Фактически, когда вы играете с массивами, вы не знаете размер аванса, вы можете сделать еще несколько проверок безопасности, и добавление 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 ); } 

Попробуй это,

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

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

В этом случае я предпочитаю автоматические массивы для динамического распределения памяти, так как это проще сделать правильно, а не утечка случайно.

используя код Вадима, я придумал эту тестовую программу:

 #include  #include  #include  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 . . . 

–dave