2017-05-06 408 views
0

我有一個整數數組:如何將int數組值存儲在char數組中?

int a[4] = {192,168,8,100}; 

我需要這些數字存儲在字符數組類似如下:

char ip[15] = "192.168.8.100"; 

是否有任何庫函數在C使用?

+6

'sprintf(ip,「%d。%d。%d。%d」,a [0],a [1],a [2],a [3])'就夠了。 –

+4

另外'char ip [15]' - >'char ip [16]' – BLUEPIXY

+0

謝謝。這很簡單。 :) –

回答

1

如果你想要在堆上動態分配內存,你可以使用asprintf

char *ip = NULL; 
int ret; 
ret = asprintf(&ip, "%d.%d.%d.%d", a[0], a[1], a[2], a[3]); 
if (ret < 0) 
{ 
// error handling 
} 
// use ip 
free(ip); 
ip = NULL; 

否則,如果您事先知道尺寸,您可以使用sprintf

sprintf(ip, "%d.%d.%d.%d", a[0], a[1], a[2], a[3]); 

就個人而言,我更喜歡使用asprintf,但是,你要記住,以釋放asprintf分配的內存,否則你會得到一個內存泄漏。

附註asprintf在內部調用realloc,因此只要您釋放連續調用,就可以將其用於字符串連接。

+4

'asprintf'不是標準的。 –

+1

您的第一個區塊中的第3行應該是'ret = asprintf(&ip,「%d。%d。%d。%d」,a [0],a [1],a [2],a [3] );' –

0

你總是,總是總是檢查你是不是超越用C你的緩衝區,尤其是當你要處理的數據你就錯過了一個網絡。

例如,您將數組設置爲十五個字符,但字符串"100.100.100.100"具有十六個,其終止空值。目前這種方法很有效,但脆弱不堪。或者你可能會得到bug或惡意輸入,如{-1000000000L, -1000000000L, -1000000000L, -1000000000}。或者你以後可能會重構來支持IPv6。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define DOTTED_IPV4_LEN  16U 

int main(void) 
{ 
    static const unsigned char a[4] = {192,168,8,100}; 
    char ip[DOTTED_IPV4_LEN]; 

    snprintf(ip, DOTTED_IPV4_LEN, "%u.%u.%u.%u", a[0], a[1], a[2], a[3]); 
    puts(ip); 

    return EXIT_SUCCESS; 
} 

事實上,一些商店,包括我認爲微軟,甚至不接受目標緩衝區所聲明的堆棧一樣,並會要求進行ip動態分配的內存指針的額外的防範措施,或許:

#include <assert.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define DOTTED_IPV4_LEN  16U 

int main(void) 
{ 
    static const unsigned char a[4] = {192,168,8,100}; 
    char (* const ip)[DOTTED_IPV4_LEN] = malloc(sizeof(*ip)); 

    assert(ip); 
    snprintf(*ip, sizeof(*ip), "%u.%u.%u.%u", a[0], a[1], a[2], a[3]); 
    puts(*ip); 

    free(ip); // Unnecessary because we're about to quit. 
    return EXIT_SUCCESS; 
}