2017-09-26 205 views
0

我試圖將整數轉換爲char *指針,以便我可以正確地將參數發送到另一個函數。無論如何沒有atoi做到這一點?INT轉換爲char *指針

int number=2123, number2= 1233; 
char* arg[]; 

arg[0] = number; 
arg[1] = number2; 

**對不起,不使事情明確所以基本上我希望ARG [0]爲等於數字的字符串代表,這樣我可以發送它到這樣的功能:轉換(字符* ARG );

我想改變參數的數據類型,但它必須是指針發送。

+0

所以,你希望arg []中的參數是數字的字符串表示,就像上面的「2123」和「1233」一樣? – Joe

+0

你很困惑。你真的想把數字轉換成它的字符表示(在這種情況下,你需要像sprintf())?或者,你的函數使用char *知道如何處理整數的地址?此外,您需要爲arg [],arg [0]和arg [1]分配內存。 –

+1

爲什麼你不能首先使用'atoi'? – myaut

回答

0

如果假定一個指針總是至少同樣大小的整數(是否有任何例外?),你可以放心地將整數的指針和回用以下宏:

#define INT2POINTER(a) ((char*)(intptr_t)(a)) 
#define POINTER2INT(a) ((int)(intptr_t)(a)) 

或者,如果其他的功能是不是你的功能,但希望整數作爲可以使用asprintf()這樣的字符串的函數:

asprintf(&arg[0],"%d",number); 
asprintf(&arg[1],"%d",number2); 

但asprintf不是POSIX標準,所以可能不提供所有系統。您可以使用sprintf()(或snprintf(),以便安全),但是需要首先計算字符串長度。

0

整數轉換爲char*指針,以便我可以正常發送參數到另一個函數。

通過經由化合物字面調用帶有char陣列的輔助函數轉換的數目創建的數量的表示。該字符串對於該函數和該代碼塊的末尾是有效的。足夠的弦的大小是重要的 - 留下一個單獨的練習。這裏的代碼使用41,足夠用於128位int。不需要通過malloc()/free()進行內存管理,以獲得如此小的緩衝區。

char *my_itoa(char *dest, int i) { 
    sprintf(dest, "%d", i); 
    return dest; 
} 

#define ITOA(n) my_itoa((char [41]) { 0 }, (n)) 

int main(void) { 
    int number=2123, number2= 1233; 
    printf("<%s> <%s>\n", ITOA(number), ITOA(number2)); 
    printf("<%s> <%s> <%s>\n", ITOA(INT_MIN), ITOA(0), ITOA(INT_MAX)); 
} 

輸出

<2123> <1233> 
<-2147483648> <0> <2147483647> 
+0

*請*稱它'itoa'! –

+0

@SteveSummit .ekatsim a saw tahT。代碼修改。 – chux

-2

下面是函數你「重新尋找:

char *int_to_char(int nb) 
{ 
    int div; 
    char *str; 
    int i; 
    int size; 
    int sign; 

    i = -1; 
    sign = 1; 
    size = get_int_lenght(nb); 
    if (!(str = malloc(sizeof(char) * (size + 1)))) 
    return (NULL); 
    if (nb < 0) 
    { 
     sign *= -1; 
     nb *= -1; 
    } 
    if (nb == 0) 
    { 
     str[++i] = '0'; 
     str[i + 1] = 0; 
     return (str); 
    } 
    while (nb > 0) 
    { 
     str[++i] = (nb % 10) + '0'; 
     nb /= 10; 
    } 
    if (sign < 0) 
    str[++i] = '-'; 
    str[i + 1] = 0; 
    return (my_revstr(str)); 
} 

隨着revstr功能:

char *my_revstr(char *str) 
{ 
    int i; 
    int j; 
    char tmp; 

    i = -1; 
    j = strlen(str); 
    while (++i < j) 
    { 
     tmp = str[i]; 
     str[i] = str[--j]; 
     str[j] = tmp; 
    } 
    return (str); 
} 

而且get_int_lenght功能:

int  get_int_lenght(int nb) 
{ 
    int size; 

    size = 0; 
    if (nb <= 0) 
    { 
     size++; 
     nb *= -1; 
    } 
    while (nb > 0) 
    { 
     size++; 
     nb /= 10; 
    } 
    return (size); 
} 
+0

'while(nb> 0)'是否定'int'和'0'的問題。 – chux

+0

該函數分配堆內存來保存結果字符串。這不一定是壞事,但它需要記錄,以便調用者可以釋放內存並避免內存泄漏。 –

+0

是的,它已更新,它適用於我:) – YaatSuka