C++ 将值从char指针复制到char数组

C++ 将值从char指针复制到char数组,c++,arrays,pointers,C++,Arrays,Pointers,我有一个指针*ip\u地址\u服务器,它保存服务器的ip地址: in_addr * address = (in_addr * )record->h_addr; char *ip_address_server = inet_ntoa(* address); 显然,当我使用printf打印它的值时,它会被很好地打印出来 printf("p address %s" , ip_address_server); 但是现在如果我声明一个数组,比如说大小为20的数组来保存这个值,那么我

我有一个指针*ip\u地址\u服务器,它保存服务器的ip地址:

   in_addr * address = (in_addr * )record->h_addr;
    char *ip_address_server = inet_ntoa(* address);
显然,当我使用printf打印它的值时,它会被很好地打印出来

printf("p address %s" , ip_address_server);
但是现在如果我声明一个数组,比如说大小为20的数组来保存这个值,那么我需要将内容从指针复制到数组

char host_name[20];
为了复制我使用for循环的值。但我稍后打印的值不是正确的值

for(int i = 0; ip_address_server[i] != '\0'; i++) 
        host_name[i] = ip_address_server[i];
    printf("hostname %s \n" , host_name);
我认为终止条件有一些错误

我的方法是错误的还是有其他的解决方法

  • 使用memcpy()函数,而不是逐字节复制值
  • 您需要复制终止的空字符,否则会得到垃圾。这适用于memcpy调用和循环
  • 主机名可以大于20个字节。我现在不记得确切的值,但我会分配至少100字节的数组。Upd:Wikipedia说“每个标签最多可包含63个字符。完整域名的总长度不得超过253个字符。[9]在实践中,一些域注册中心可能有较短的限制。”

  • 循环没有复制
    '\0'
    字节


    另外,为什么不使用(或更安全的)或?

    字符数组末尾缺少nul字符。for循环复制所有字符,但不复制nul字符。要解决此问题,您必须在循环外复制它,如下所示:

    int i;
    for( i = 0; ip_address_server[i] != '\0'; i++) 
            host_name[i] = ip_address_server[i];
    host_name[i] = 0; // add nul char.
    printf("hostname %s \n" , host_name);
    

    安全和更好的方法:

    snprintf(host_name, sizeof(host_name), "%s", ip_address_server);
    

    您的示例不起作用,因为
    i
    不是在
    for
    语句之外定义的。
    inet\u ntoa
    只会将IPv4地址从'in\u addr'形式转换为
    点和数字
    字符串形式,它不会执行任何反向DNS查找等操作,因此只需要16个字符。