将char指针中的值复制到char数组

时间:2010-10-17 16:22:45

标签: c++ arrays pointers

我有一个指针* ip_address_server,它保存服务器的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 个答案:

答案 0 :(得分:5)

您的循环不会复制'\0'字节。

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

答案 1 :(得分:2)

安全&更好的方法:

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

答案 2 :(得分:1)

  1. 使用memcpy()函数而不是逐字节复制值
  2. 你需要复制终止的NULL字符,否则你会得到垃圾。这适用于memcpy call和你的循环
  3. 主机名可以大于20个字节。我现在不记得确切的值,但我会分配至少100字节的数组。 更新:维基百科说“每个标签最多可包含63个字符。完整域名的总长度不得超过253个字符。[9]实际上,某些域名注册管理机构可能会有更短的限制。”

答案 3 :(得分:1)

您缺少char数组末尾的空字符。你的for循环复制所有字符,但不复制空字符。为了解决这个问题,你必须在循环之外自己复制一次:

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