The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"char, 0, strcat Часть 2"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

"char, 0, strcat Часть 2"  
Сообщение от Fisher (??) on 01-Фев-08, 07:28 
Здравствуйте! Спасибо за ответы в предыдущей теме.
Теперь надо немного модифицировать программу.

Есть массив символов:
char head[4] = {11,1,0,13};

Необходимо скопировать его в packet, т.е.

char* packet = new char;
memcpy(packet,head,sizeof(head)); //

В результате на выходе получается: 111013 : все нормально

Далее необходимо присоединить к packet с cret, т.е.
char cret[4] = {0,1,0,22};
strcat(packet,cret); // Получается 1101300.., в cret[0]=0 - символ конца строки

delete packet;

Подскажите пожалуйста, как правильно присоединить cret к пакет.
Спасибо!

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "char, 0, strcat Часть 2"  
Сообщение от anonymous (??) on 01-Фев-08, 08:17 
>Есть массив символов:
>char head[4] = {11,1,0,13};

Это не символы, это просто байты, так как head -- не строка:
* в середине встречаются нулевые байты
* в конце нет нулевого байта

>char* packet = new char;
>memcpy(packet,head,sizeof(head)); //
>
>В результате на выходе получается: 111013 : все нормально

Ничего нормального тут нет: выделена память под один char, а записываете аж 4 штуки.

>Далее необходимо присоединить к packet с cret, т.е.
>char cret[4] = {0,1,0,22};
>strcat(packet,cret); // Получается 1101300.., в cret[0]=0 - символ конца строки
>
>delete packet;
>
>Подскажите пожалуйста, как правильно присоединить cret к пакет.

Вы имеете дело с двоичными данными, в которых может встретиться (и встречается) нулевой байт.  С такими данными нельзя работать строковыми функциями семейства str...()  Нужно использовать только memcpy() и memmove()

При условии, вы исправите программу и она будет выделять достаточно памяти для packet, "присоединение" делается так:
memcpy(packet + sizeof(head), cret, sizeof(cret));

PS.  Раз уже пишете настолько низкоуровневые вещи, попробуйте писать на чистом Си и использовать malloc() и free().  Заодно разберитесь с тем, что память -- это блоки, что такое арифметика с указателями и так далее.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "char, 0, strcat Часть 2"  
Сообщение от Fisher (??) on 01-Фев-08, 08:53 
При условии, вы исправите программу и она будет выделять достаточно памяти для packet, "присоединение" делается так:
memcpy(packet + sizeof(head), cret, sizeof(cret));

А если мне не известно сколько памяти нужно выделить для packet, т.е.
мне нужно сформировать пакет:

packet = head(заголовок)+cret(код запроса)+login(имя ползователя),

где login - не имеет фиксированный размер байтов(так вроде правильнее).

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "char, 0, strcat Часть 2"  
Сообщение от Fisher (??) on 01-Фев-08, 10:39 
>[оверквотинг удален]
>packet, "присоединение" делается так:
>memcpy(packet + sizeof(head), cret, sizeof(cret));
>
>А если мне не известно сколько памяти нужно выделить для packet, т.е.
>
>мне нужно сформировать пакет:
>
>packet = head(заголовок)+cret(код запроса)+login(имя ползователя),
>
>где login - не имеет фиксированный размер байтов(так вроде правильнее).

Извините, не подумал, все же можно узнать сколько памяти необходимо выделить для packet.


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "char, 0, strcat Часть 2"  
Сообщение от anonymous (??) on 01-Фев-08, 23:29 
>Извините, не подумал, все же можно узнать сколько памяти необходимо выделить для
>packet.

В довольно редких случаях, когда невозможно или очень сложно подсчитать, сколько точно памяти понадобится, можно выделять память "по-максимуму" для самого худшего случая.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру