将整数转换为数组

我试图将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; } 

编辑:只是更多的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相关。

来自Greg Hewgill的回答 :

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

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

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

 #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