我有一个整数数组:
int a[4] = {192,168,8,100};
我需要将这些数字存储在char数组中,如下所示:
char ip[15] = "192.168.8.100";
C中是否有任何库函数可供使用?
答案 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,因此只要您释放连续调用,就可以将其用于字符串连接。
答案 1 :(得分:0)
总是,始终, 总是 检查您是否在C中没有超出缓冲区,特别是在您处理时你通过网络获得的数据。
例如,您将数组设置为十五个字符,但字符串"100.100.100.100"
的十六,其终止为null。这虽然现在有用,但是很不稳定。或者您可能会遇到像{-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;
}