我基本上想要轉換給定的int數並在數組中存儲單個數字以便進一步處理。 我知道我可以使用%並獲取每個數字並存儲它。但事情是,如果我不知道直到運行時int的位數,因此我不能分配數組的大小。所以,我不能倒退(從單位的地方)。 我也不想先將數字後字存儲在數組中,然後再次顛倒數組。 有沒有其他方式可以做到這一點?在'C'中將int轉換爲int []
例如:int num = 12345; OUTPUT:ar [0] = 1,ar [1] = 2等等,其中ar []是一個int數組。
我基本上想要轉換給定的int數並在數組中存儲單個數字以便進一步處理。 我知道我可以使用%並獲取每個數字並存儲它。但事情是,如果我不知道直到運行時int的位數,因此我不能分配數組的大小。所以,我不能倒退(從單位的地方)。 我也不想先將數字後字存儲在數組中,然後再次顛倒數組。 有沒有其他方式可以做到這一點?在'C'中將int轉換爲int []
例如:int num = 12345; OUTPUT:ar [0] = 1,ar [1] = 2等等,其中ar []是一個int數組。
最簡單的方法是計算的位數知道數組的大小,你需要
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])來確定你的數字的位數。
轉換可能不是正確的詞。您可以接受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
}
如果有一個32位的整數類型,最大值將被至多包括10個數字(不包括負數符號)。這可能是你的上限。
如果需要動態地確定最小足夠的大小,可以判斷,與正常比較(因爲調用對數函數是可能更昂貴,但一種可能性):
size = 10;
if (myint < 1000000000) size--;
if (myint < 100000000) size--;
/* ... */
聲明陣列是動態大小取決於您使用的C語言標準。在C89中,動態數組大小(基於運行時計算的值)是不可能的。您可能需要使用動態分配的內存。
HTH,
約翰
下面的完整程序顯示了這樣做的一種方式。它使用無符號整數,以便不必擔心轉換 - 您沒有說明負數應該發生什麼,所以像任何好的顧問一樣,爲了我自己的方便,我讓問題消失:-)
它基本上計算出所需的數組大小並分配它。數組本身在開始時有一個元素,用於指定數組中有多少元素(長度爲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
功能是「肉」 - 它分配一個整數陣列放置(到N的索引1,其中N是數字數)的長度(索引0)和數字。以下是我使用的測試程序。
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
爲什麼你把數組的長度放在'arr [0]'中?指定的問題* OUTPUT:ar [0] = 1,ar [1] = 2。*這種做法我可以,但我認爲應該更明確地說明。此外,在這個答案格式的元討論是在這裏:http://meta.stackexchange.com/q/111015 –
我把它放在數組[0],因爲你需要知道什麼長度(因爲你所得到的是一個int指針),我想我已經說清楚了,但我會盡力澄清。你可以輕鬆地傳回長度作爲額外的值(傳遞函數的長度指針來填充)。而且我知道這個討論,我開始了:-)現在我要改變我所有的舊答案,因爲我正在重新審視它們以刪除nbsp的東西。 – paxdiablo
調用'convert(num)'後'num'仍然在範圍內。你將這個長度傳遞給函數!另外,美麗的修復。感謝您接受我的建議! –
您可以通過採取以10爲底的對數,並加入一個找出位數。爲此,您可以使用標準數學庫中的log10
或log10f
函數。這可能是有點慢,但它可能是隻要最準確的double
有足夠位準確地表示您的號碼:
int numdigits = 1 + log10(num);
或者,你可以反覆除以十,直到結果是零和計數數字那樣。
還有一種選擇是爲該類型可以具有的最大位數分配足夠的空間。對於一個32位整數,這將是10;對於64位,20應該足夠了。您可以將多餘的數字清零。由於即使在最糟糕的情況下,這也不是很浪費空間,所以它可能是最簡單和最快的選擇。不過,您必須知道設置中的int
有多少位。
您也可以通過爲每個使用的10位分配3位數字加上1來進行相當好的估計。這應該是足夠的數字,除非比特數是可笑的大(任何通常的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 */
如果數字是負數,這最後一個將不起作用(直接)。
你基本上想要做的就是把你的整數轉換成一個小數位數組。 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';
}
後一種方法將有一些意想不到的邊緣情況 - 例如。如果調用不是簡單的從shell調用(例如,Python的'subprocess.Popen(['digits','10',...,'''),那麼可以用空格填充數字。或者甚至是來自外殼,但是有人在bash中完成了相當於IFS ='\ t''的操作。 – detly