如何将int数组值存储在char数组中?

问题描述:

我有一个整数数组:如何将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

谢谢。这很简单。 :) –

如果你想要在堆上动态分配内存,你可以使用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] );' –

你总是,总是总是检查你是不是超越用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; 
}