Convert integer to array

I am trying to convert an integer in C to an array containing each of these digits

i.e. if I have

int number = 5400 

how can i get to

 int numberArray[4] 

Where

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

Any suggestions gratefully received.

+6
c arrays
source share
8 answers

This will work for numbers> = 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; } 

EDIT: A little more C-style, but more mysterious.

 #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; } 
+13
source share

You can calculate the number of digits in an integer with a logarithm, and not in a loop. Thus,

 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; } 
+6
source share

Hint: take a look at this earlier question, Sum of digits in C # . "It explains how to extract numbers in numbers using several methods, some of which relate to C.

From the answer of Greg Huglill :

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

Calculating the number of digits is complicated, but assuming it always consists of 4 digits that you can do:

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

If you need to consider negative numbers, you may need additional logic. In fact, when you play with arrays, you don’t know the size of the advance, you can do some more security checks, and adding an API to process the data structure is also very convenient.

 // 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 ); } 
+1
source share

Try it,

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

C code:

 /* 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); 

You will see how many digits you converted, taking the difference

 digitsp - digits 

If you want to include it in a function:

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

I prefer automatic arrays for allocating dynamic memory in this case, since it is easier to do it right, rather than accidentally leaking.

0
source share

using the vadim code, I came up with this test program:

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

but the way out is trash. Can anyone advise if I did something stupid here?

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

- dave

0
source share

All Articles