簡體   English   中英

在'C'中將int轉換為int []

[英]Converting int to int[] in 'C'

我基本上想轉換給定的int數並將單個數字存儲在數組中以進行進一步處理。 我知道我可以使用%並獲取每個數字並將其存儲。 但是問題是,如果我在運行時之前不知道int的位數,因此無法分配數組的大小。 因此,我無法從單位位置向后工作。 我也不想首先將數字反向詞存儲在數組中,然后再次反轉數組。 還有其他方法可以做到這一點嗎?

例如:int num = 12345; 輸出:ar [0] = 1,ar [1] = 2,依此類推,其中ar []是一個int數組。

轉換可能不是正確的詞。 您可以獲取int,動態分配新的int [],然后將int的數字存儲到int []中。 我正在使用以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
}

最簡單的方法是計算位數以知道所需的數組大小

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])即可確定數字中的位數。

如果您使用的是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函數是“肉”-它分配一個整數數組來放置長度(索引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

您可以通過以10為底的對數加一個來找出位數。 為此,您可以使用標准數學庫中的log10log10f函數。 這可能會慢一些,但是只要double有足夠的位數來准確表示您的數字,它可能是最精確的:

int numdigits = 1 + log10(num);

或者,您可以重復除以十,直到結果為零,然后以這種方式計算數字。

還有一種選擇就是為該類型可以擁有的最大位數分配足夠的空間。 對於32位整數,則為10;對於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';
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM