2011-11-04 201 views
2

我基本上想要轉換給定的int數並在數組中存儲單個數字以便進一步處理。 我知道我可以使用%並獲取每個數字並存儲它。但事情是,如果我不知道直到運行時int的位數,因此我不能分配數組的大小。所以,我不能倒退(從單位的地方)。 我也不想先將數字後字存儲在數組中,然後再次顛倒數組。 有沒有其他方式可以做到這一點?在'C'中將int轉換爲int []

例如:int num = 12345; OUTPUT:ar [0] = 1,ar [1] = 2等等,其中ar []是一個int數組。

回答

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])來確定你的數字的位數。

+0

後一種方法將有一些意想不到的邊緣情況 - 例如。如果調用不是簡單的從shell調用(例如,Python的'subprocess.Popen(['digits','10',...,'''),那麼可以用空格填充數字。或者甚至是來自外殼,但是有人在bash中完成了相當於IFS ='\ t''的操作。 – detly

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 
} 
+0

使用'log10(num)+ 1'而不是'ceil'。它處理'10^x'的情況('log10(10^x)= x')。另外,我認爲你要按照他想要的相反順序填充陣列。 – mange

+0

'new'?在C?真?我不這麼認爲......而你正在向後存儲,就像OP _didn't_想要的一樣。 – paxdiablo

+0

不,你們是對的......現在想想直了太遲了。將解決。 –

1

如果有一個32位的整數類型,最大值將被至多包括10個數字(不包括負數符號)。這可能是你的上限。

如果需要動態地確定最小足夠的大小,可以判斷,與正常比較(因爲調用對數函數是可能更昂貴,但一種可能性):

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

聲明陣列是動態大小取決於您使用的C語言標準。在C89中,動態數組大小(基於運行時計算的值)是不可能的。您可能需要使用動態分配的內存。

HTH,

約翰

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功能是「肉」 - 它分配一個整數陣列放置(到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 
+0

爲什麼你把數組的長度放在'arr [0]'中?指定的問題* OUTPUT:ar [0] = 1,ar [1] = 2。*這種做法我可以,但我認爲應該更明確地說明。此外,在這個答案格式的元討論是在這裏:http://meta.stackexchange.com/q/111015 –

+0

我把它放在數組[0],因爲你需要知道什麼長度(因爲你所得到的是一個int指針),我想我已經說清楚了,但我會盡力澄清。你可以輕鬆地傳回長度作爲額外的值(傳遞函數的長度指針來填充)。而且我知道這個討論,我開始了:-)現在我要改變我所有的舊答案,因爲我正在重新審視它們以刪除nbsp的東西。 – paxdiablo

+0

調用'convert(num)'後'num'仍然在範圍內。你將這個長度傳遞給函數!另外,美麗的修復。感謝您接受我的建議! –

0

您可以通過採取以10爲底的對數,並加入一個找出位數。爲此,您可以使用標準數學庫中的log10log10f函數。這可能是有點慢,但它可能是隻要最準確的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 */ 

如果數字是負數,這最後一個將不起作用(直接)。

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