代码之家  ›  专栏  ›  技术社区  ›  w2lame

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

  •  4
  • w2lame  · 技术社区  · 14 年前

    我有一个指针*ip_address_服务器,它保存服务器的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);
    

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

    4 回复  |  直到 14 年前
        1
  •  2
  •   Johan Kotlinski    14 年前

    更安全的方法:

    snprintf(host_name, sizeof(host_name), "%s", ip_address_server);
    
        2
  •  5
  •   wkl    14 年前

    你的循环没有复制 '\0' 字节。

    还有,你为什么不用 strcpy (或更安全 strncpy )或者 memcpy ?

        3
  •  1
  •   Eugene Mayevski 'Callback    14 年前
    1. 您需要复制终止的空字符,否则会收到垃圾邮件。这适用于memcpy调用和循环
    2. 主机名可以大于20字节。我现在不记得确切的值,但我至少会分配100字节数组。 维基百科说“每个标签最多可以包含63个字符。完整域名的总长度不能超过253个字符。[9]实际上,某些域注册表的限制可能更短。”
        4
  •  1
  •   codaddict    14 年前

    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);