Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Теперь учусь работать со строками... / 25 сообщений из 30, страница 1 из 2
10.11.2006, 13:33
    #34119371
дед Макар
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теперь учусь работать со строками...
Что-то никак не раздуплюсь....
Есть тип данных int. Он занимает sizeof(int) байт. (У меня 4). Есть у меня строка "teststring" - 10 байт. А еще у меня есть char buf[1000] который должен содержать sizeof(int) байт - длина сообщения, остальное - само сообщение. Не могу никак понять каким образом это соорудить? трудность составляет запись числа 10 в первые четыре байта буфера, и последующее их извлечение.
...
Рейтинг: 0 / 0
10.11.2006, 13:54
    #34119464
Den_di
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теперь учусь работать со строками...
Ну а если так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
#include <stdio.h>
#include <string.h>

int main ()
{
  char str1[]="Sample string";
  char str2[ 40 ];
  
  int len;
  len=sizeof(str1);
  *(int*)&str2[ 0 ]=len;
  strcpy (&str2[ 4 ],str1);
  printf ("str1: %s\nstr2: %s\n",str1,&str2[ 4 ]);
  return  0 ;
}
...
Рейтинг: 0 / 0
10.11.2006, 14:08
    #34119530
Ой Вэй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теперь учусь работать со строками...
наверно так:

сначало число:
int nNumber = 10;
memcpy(buf,&nNumber,sizeof(int));

а потом строку:
char[] cString = "teststring";
memcpy(buf+sizeof(int),cString,sizeof(cString));
...
Рейтинг: 0 / 0
10.11.2006, 14:08
    #34119531
Теперь учусь работать со строками...
дед МакарЧто-то никак не раздуплюсь....
Есть тип данных int. Он занимает sizeof(int) байт. (У меня 4). Есть у меня строка "teststring" - 10 байт. А еще у меня есть char buf[1000] который должен содержать sizeof(int) байт - длина сообщения, остальное - само сообщение. Не могу никак понять каким образом это соорудить? трудность составляет запись числа 10 в первые четыре байта буфера, и последующее их извлечение.
Такая вещь, как правило, реализуется через структуру:
Код: plaintext
1.
2.
3.
4.
struct Stroka {
  int StrokaID;
  char StrokaMess[ 100 ];
};

Если же нужно именно так, как Вы описали, то есть такое решение:
- число int считывать как массив char (естественно, что конечного элемента в этом массиве не будет, поэтому надо самому озаботиться контролем выхода за границы).
- скопировать 4 символа в Вашу итоговую строку.
- скопировать в итоговую строку текст
Например, возможна такая реализация (запись):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
  int k= 123 ;
  char *pa;
  char p[]="qwerty";
  char pb[ 1000 ];
  pa=(char *)&k;
  strncpy(pb,pa, 4 );
  strncpy(pb+ 4 ,p,strlen(p));
...
Рейтинг: 0 / 0
10.11.2006, 14:10
    #34119541
Теперь учусь работать со строками...
Ой Вэйнаверно так:

сначало число:
int nNumber = 10;
memcpy(buf,&nNumber,sizeof(int));

а потом строку:
char[] cString = "teststring";
memcpy(buf+sizeof(int),cString,sizeof(cString));

Так, наверное, лучше....
Что-то я про memcpy совсем забыл... Зациклился на строках...
...
Рейтинг: 0 / 0
10.11.2006, 14:16
    #34119574
Ой Вэй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теперь учусь работать со строками...
2 Станислав С
Вариант со структурой, конечно, гораздо понятнее и удобнее. Незачем смешивать данные разных типов и потом самому же от этого страдать.
...
Рейтинг: 0 / 0
10.11.2006, 14:24
    #34119608
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теперь учусь работать со строками...
И в таких случаях, лучше не забывать ставить на всякий случай директивы "упакованных" структур.
...
Рейтинг: 0 / 0
10.11.2006, 14:27
    #34119617
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теперь учусь работать со строками...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
struct PascalString
{
 int Length;
 char Chars[ 1 ];
};

char buff[ 1000 ];
PascalString *pstr=(PascalString*)buff;
pstr->Length=strlen(teststring);
strcpy(pstr->Chars,teststring);
...
Рейтинг: 0 / 0
10.11.2006, 14:28
    #34119622
Теперь учусь работать со строками...
Ой Вэй2 Станислав С
Незачем смешивать данные разных типов и потом самому же от этого страдать.
Я так понимаю, что в целях исключительно самообразования, дедМакар пытается эмулировать Паскалевские строки...
...
Рейтинг: 0 / 0
10.11.2006, 14:30
    #34119632
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теперь учусь работать со строками...
AkhИ в таких случаях, лучше не забывать ставить на всякий случай директивы "упакованных" структур.если первый инт, то не обязательно.
...
Рейтинг: 0 / 0
10.11.2006, 14:43
    #34119687
дед Макар
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теперь учусь работать со строками...
Станислав С
Я так понимаю, что в целях исключительно самообразования, дедМакар пытается эмулировать Паскалевские строки...
к сожалению (наверное) я не знаю что такое паскалевские строки
...
Рейтинг: 0 / 0
10.11.2006, 14:57
    #34119750
blinded
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теперь учусь работать со строками...
щас научите ребенка паковать структуры в буффер, а он их по сетке таскать начнет, и все у него будет хорошо, пока не придет он комп с неинтеловской архитектурой да еще вдобавок 64 разрядный, во намается...
...
Рейтинг: 0 / 0
10.11.2006, 15:04
    #34119789
Теперь учусь работать со строками...
дед Макар Станислав С
Я так понимаю, что в целях исключительно самообразования, дедМакар пытается эмулировать Паскалевские строки...
к сожалению (наверное) я не знаю что такое паскалевские строки
Имелась в виду концепция, принятая в типе string языка программирования Паскаль и его "деток" (Object Pascal, Делфи):
сначала в string идет длина строки (число), затем - "полезные данные" (буковки, составляющие строку). Функции, работающие с такой строкой, используют значение длины строки для контроля выхода за границы строки (=массива символов). Пользователь же при просмотре всегда видит только "полезные данные"
...
Рейтинг: 0 / 0
10.11.2006, 15:23
    #34119854
дед Макар
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теперь учусь работать со строками...
да, именно memcpy мне и не хватало. Сделал как написал Ой Вэй. Все получилось. Спасибо
...
Рейтинг: 0 / 0
10.11.2006, 15:37
    #34119911
Den_di
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теперь учусь работать со строками...
Мда. 10 ответов на очевидный вопрос. Тут что, на любую чушь позми писать будут?
...
Рейтинг: 0 / 0
10.11.2006, 15:40
    #34119923
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теперь учусь работать со строками...
Den_diМда. 10 ответов на очевидный вопрос. Тут что, на любую чушь позми писать будут?

Бывает и круче. :)
...
Рейтинг: 0 / 0
10.11.2006, 19:50
    #34120686
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теперь учусь работать со строками...
Лучше всего структуру написать соответствующую...
...
Рейтинг: 0 / 0
10.11.2006, 21:55
    #34120804
Den_di
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теперь учусь работать со строками...
MasterZivЛучше всего структуру написать соответствующую...
Ещё один... Баваите тогда класс напишем, перегрузим всё что можно и будет нам счастье. Тогда строги можно и делить будет, и инвертировать и числу присваивать и вообще всё что угодно.
...
Рейтинг: 0 / 0
11.11.2006, 12:12
    #34121095
Aklin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теперь учусь работать со строками...
Den_di

я же говорил, что сабж - местный юмор
...
Рейтинг: 0 / 0
13.11.2006, 15:18
    #34124200
дед Макар
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теперь учусь работать со строками...
не знаю как насчет юмора - но не до смеха. использую сокеты. Есть функция у них - int recv(
SOCKET s,
char* buf,
int len,
int flags
);

В качестве буфера используется char* (из-за чего все и началось). А если мне в качестве буфера надо передать структуру? или экземпляр класса?
...
Рейтинг: 0 / 0
13.11.2006, 15:55
    #34124358
pandrew
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теперь учусь работать со строками...
дед Макарне знаю как насчет юмора - но не до смеха. использую сокеты. .. В качестве буфера используется char* (из-за чего все и началось). А если мне в качестве буфера надо передать структуру? или экземпляр класса?
Ну и напишешь когда дело дойдет для struct St{} st;
recv(s,&st,sizeof(st),..);
При этом достаточно обеспечить на обоих концах однозначное понимание struct (т.е. выравнивание, порядок байт..).
...
Рейтинг: 0 / 0
13.11.2006, 15:57
    #34124361
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теперь учусь работать со строками...
делов-то
Код: plaintext
1.
struct MyStruct mystruct;
recv(s, (char*)&mystruct, sizeof(mystruct), flags);
...
Рейтинг: 0 / 0
13.11.2006, 16:23
    #34124467
дед Макар
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теперь учусь работать со строками...
ага, понятно. Смущала меня конструкция
(char*)&mystruct
но все таки видимо так и надо :)
Все хорошо, но вот еще вопрос.
У меня структура типа
Код: plaintext
1.
2.
3.
struct CTestSrtuct {
	int type;
	char *str;
};
type передается хорошо, а вот str - никак. Чем лечить? Длину строки зараннее я не знаю.
...
Рейтинг: 0 / 0
13.11.2006, 16:28
    #34124488
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теперь учусь работать со строками...
char - это указатель, а если его заменить на массив char[x]?

--------------------------------------------------------------
[подпись с другого сайта]
...
Рейтинг: 0 / 0
13.11.2006, 16:31
    #34124507
дед Макар
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теперь учусь работать со строками...
да я ж говорю не знаю длину строки
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Теперь учусь работать со строками... / 25 сообщений из 30, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]