从字符指针复制值到字符数组

4
我有一个指针*ip_address_server,它保存着服务器的IP地址:
   in_addr * address = (in_addr * )record->h_addr;
    char *ip_address_server = inet_ntoa(* address);

很明显,当我使用printf打印it的值时,它会被漂亮地打印出来。

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个回答

6

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

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


3

你的字符数组末尾缺少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);

你的例子不会起作用,因为 ifor 语句之外没有被定义。 - Ferdinand Beyer

3

安全可靠的做法:

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

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

inet_ntoa 只会将 IPv4 地址从 'in_addr' 形式转换为 点分十进制 字符串形式,它不会执行任何反向 DNS 查找等操作,因此只需要 16 个字符。 - Eugen Constantin Dinca

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接