我基本上想要转换给定的int数并将各个数字存储在数组中以供进一步处理。 我知道我可以使用%并获取每个数字并存储它。但问题是如果我直到运行时才知道int的位数,因此我无法分配数组的大小。所以,我不能倒退(来自单位)。 我也不想先在数组中存储数字后缀,然后再次反转数组。 有没有其他方法可以做到这一点?
例如:int num = 12345; OUTPUT:ar [0] = 1,ar [1] = 2,依此类推,其中ar []是一个int数组。
答案 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对数并添加一个来找出位数。为此,您可以使用标准数学库中的log10
或log10f
函数。这可能有点慢,但只要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';
}