我有一個整數數組:如何將int數組值存儲在char數組中?
int a[4] = {192,168,8,100};
我需要這些數字存儲在字符數組類似如下:
char ip[15] = "192.168.8.100";
是否有任何庫函數在C使用?
我有一個整數數組:如何將int數組值存儲在char數組中?
int a[4] = {192,168,8,100};
我需要這些數字存儲在字符數組類似如下:
char ip[15] = "192.168.8.100";
是否有任何庫函數在C使用?
如果你想要在堆上動態分配內存,你可以使用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,因此只要您釋放連續調用,就可以將其用於字符串連接。
'asprintf'不是標準的。 –
您的第一個區塊中的第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;
}
'sprintf(ip,「%d。%d。%d。%d」,a [0],a [1],a [2],a [3])'就夠了。 –
另外'char ip [15]' - >'char ip [16]' – BLUEPIXY
謝謝。這很簡單。 :) –