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

时间:2017-05-06 20:33:39

标签: c

我有一个整数数组:

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

我需要将这些数字存储在char数组中,如下所示:

char ip[15] = "192.168.8.100";

C中是否有任何库函数可供使用?

2 个答案:

答案 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;
}