Копирование значения из указателя на символьный массив - PullRequest
4 голосов
/ 17 октября 2010

У меня есть указатель * 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 ]

5 голосов
/ 17 октября 2010

Ваш цикл не копирует байт '\0'.

Кроме того, почему бы вам просто не использовать strcpy (или более безопасный strncpy) или memcpy?

2 голосов
/ 17 октября 2010

Безопасный и лучший способ сделать это:

snprintf(host_name, sizeof(host_name), "%s", ip_address_server);
1 голос
/ 17 октября 2010

Вам не хватает nul символа в конце массива 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);
1 голос
/ 17 октября 2010
  1. использовать функцию memcpy () вместо копирования значений побайтно
  2. вам нужно скопировать завершающий символ NULL, иначе вы получите мусор. Это относится как к вызову memcpy, так и к вашему циклу
  3. Имя хоста может быть больше 20 байтов. Я не помню точное значение в данный момент, но я бы выделил как минимум 100-байтовый массив. Upd: Википедия говорит: «Каждая метка может содержать до 63 символов. Полное доменное имя не может превышать общую длину 253 символов. [9] На практике некоторые реестры доменов могут иметь более короткие ограничения». 1008 *
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...