在'C'中将int转换为int []

时间:2011-11-04 05:17:45

标签: c arrays int

我基本上想要转换给定的int数并将各个数字存储在数组中以供进一步处理。 我知道我可以使用%并获取每个数字并存储它。但问题是如果我直到运行时才知道int的位数,因此我无法分配数组的大小。所以,我不能倒退(来自单位)。 我也不想先在数组中存储数字后缀,然后再次反转数组。 有没有其他方法可以做到这一点?

例如:int num = 12345;     OUTPUT:ar [0] = 1,ar [1] = 2,依此类推,其中ar []是一个int数组。

6 个答案:

答案 0 :(得分:4)

转换可能不是正确的词。您可以获取int,动态分配新的int [],然后将int的数字存储到int []中。我正在使用log base 10来计算num有多少位数。包含math.h以使用它。以下代码未经测试,但会让您知道该怎么做。

int num = 12345;
int size = (int)(log10(num)+1);

// allocate array
int *digits = (int*)malloc(sizeof(int) * size);

// get digits
for(int i=size-1; i>=0; --i) {
  digits[i] = num%10;
  num=num/10; // integer division
}

答案 1 :(得分:1)

最简单的方法是计算要知道所需数组大小的位数

int input = <input number>; // >= 0
int d, numdigits = 1;
int *arr;

d = input;
while (d /= 10)
   numdigits++;

arr = malloc(sizeof(int) * numdigits);

还有更简单的方法:可能是从命令行将数字作为参数传递给程序。在这种情况下,您在argp [N]中将其作为字符串接收,因此您只需调用strlen(argp [N])来确定您的数字中的位数。

答案 2 :(得分:1)

如果您有32位整数类型,则最大值最多包含10位数(不包括负数的符号)。这可能是你的上限。

如果你需要动态确定最小的足够大小,你可以通过正常的比较来确定(因为调用对数函数可能更昂贵,但有可能):

size = 10;
if (myint < 1000000000) size--;
if (myint < 100000000) size--;
/* ... */

将数组声明为动态大小取决于您使用的C语言标准。在C89中,动态数组大小(基于运行时计算的值)是不可能的。您可能需要使用动态分配的内存。

HTH,

约翰

答案 3 :(得分:1)

以下完整程序显示了一种方法。它使用无符号整数,以便不必担心转换 - 你没有说明负数会发生什么,所以,就像任何一位好顾问一样,我为了自己的方便而让问题消失了: - )

它基本上可以计算出所需的数组大小并分配它。数组本身在开始时有一个元素指定数组中有多少个元素(长度int)。

每个后续元素都是一个数字序列。下面的main代码显示了如何处理它。

如果它无法创建数组,它只会让你返回NULL - 你应该还记得在完成后释放传回的内存。

#include <stdio.h>
#include <stdlib.h>

int *convert (unsigned int num) {
    unsigned int *ptr;
    unsigned int digits = 0;
    unsigned int temp = num;

    // Figure out how many digits in the number.
    if (temp == 0) {
        digits = 1;
    } else {
        while (temp > 0) {
            temp /= 10;
            digits++;
        }
    }

    // Allocate enough memory for length and digits.
    ptr = malloc ((digits + 1) * sizeof (unsigned int));

    // Populate array if we got one.
    if (ptr != NULL) {
        ptr[0] = digits;
        for (temp = 0; temp < digits; temp++) {
            ptr[digits - temp] = num % 10;
            num /= 10;
        }
    }
    return ptr;
}

上面的convert函数是“肉” - 它分配一个整数数组来放置长度(索引0)和数字(索引1到N,其中N是数字位数)。以下是我使用的测试程序。

int main (void) {
    int i;
    unsigned int num = 12345;
    unsigned int *arr = convert (num);

    if (arr == NULL) {
        printf ("No memory\n");
    } else {
        // Length is index 0, rest are digits.

        for (i = 1; i <= arr[0]; i++)
            printf ("arr[%d] = %u\n", i, arr[i]);
        free (arr);
    }

    return 0;
}

这个输出是:

arr[1] = 1
arr[2] = 2
arr[3] = 3
arr[4] = 4
arr[5] = 5

答案 4 :(得分:0)

您可以通过取10对数并添加一个来找出位数。为此,您可以使用标准数学库中的log10log10f函数。这可能有点慢,但只要double有足够的位来准确表示您的数字,它可能是最精确的:

int numdigits = 1 + log10(num);

或者,你可以重复除以10,直到结果为零并计算那个数字。

另一个选择就是为类型可以拥有的最大位数分配足够的空间。对于32位整数,它是10;对于64位,20应该就够了。您可以将额外数字归零。由于即使在最坏的情况下也不会浪费很多空间,因此它可能是最简单和最快的选择。但是,您必须知道设置中int中有多少位。

通过为每个使用的10位分配3位数,加上一位,您也可以很好地估计。这应该是足够的数字,除非位数非常大(超过任何常用int类型可能具有的位数)。

int numdigits = 1
unsigned int n = num;
for (n = num; n & 0x03ff; n >>= 10) 
  numdigits += 3;
/* numdigits is at least the needed number of digits, maybe up to 3 more */

如果数字为负数,则最后一个(直接)不起作用。

答案 5 :(得分:0)

您基本上想要做的是将整数转换为其小数位数组。 printf系列函数完全知道如何做到这一点,无需重新发明轮子。我正在改变这个任务,因为你没有对符号说什么,而且对于无符号值更有意义。

unsigned* res = 0;
size_t len = 0;
{
  /* temporary array, large enough to hold the representation of any unsigned */
  char positions[20] = { 0 };
  sprintf(position, "%u", number);
  len = strlen(position);
  res = malloc(sizeof(unsigned[len]));
  for (size_t i = 0; i < len; ++i)
    res[i] = position[i] - '0';
}
相关问题