С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.69
ahill_odessa
0 / 0 / 0
Регистрация: 09.04.2011
Сообщений: 6
#1

Как изменить первые 5 байт в строке типа char - C++

09.04.2011, 16:14. Просмотров 1648. Ответов 13
Метки нет (Все метки)

Ламерский вопрос! Есть строка,как изменить в ней первые 5 байт, в них должна храниться длина строки
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.04.2011, 16:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как изменить первые 5 байт в строке типа char (C++):

Изменить программу для типа unsigned char - C++
Подскажите пожалуйста, что нужно изменить в программе перевода числа, чтобы она правильно работала для введенного числа типа unsigned...

Как прочитать первые 7 байт и сравнить? - C++
Всем привет. Имеется вопрос как/куда мне записать первые 7 байт файла, что бы потом сравнить с эталоном. Как понимаю надо переводить в 16...

Неправильный вывод в строке типа char - C++
char * word = new char ; for (int i = 0; i < 5 - 1; i++) word = 'a'; cout << word << endl; почему кроме 4-х а выводится еще...

Сортировка цифр в строке типа char - C++
Здравствуйте! Помогите, пожалуйста, дописать программу. Прогррамма должна сортировать буквы или цифры во введенной строке. Например...

Проверить правильность ввода в строке типа char - C++
Здравствуйте. Такой вопрос: Есть строковый массив и запись в него, но как при этом проверить все это дело на содержание в нем, либо при...

Поиск объекта в классе по строке типа char - C++
Есть такая задача : Описать класс с именем PRICE, содержащий следующие поля: - название товара; - название магазина, в котором...

13
Messir
09.04.2011, 17:58 #2
ну, либо memcpy (если замена уже подготовлена в виде массива или строки), либо посимвольно (s[0] = 'a' s[1] = 'b' ...)

P.S. Что-то сомнительно, что длина строки выражается 5-ю байтами...
paradise
10.04.2011, 12:29 #3
'в строке типа char' - интересная строка
kpoxa
5 / 5 / 0
Регистрация: 08.12.2009
Сообщений: 213
10.04.2011, 18:20 #4
С 5-ю байтами я согласен. 1, 2, 4 байта пожалуйста, а вот 5 ?!
C
1
2
3
4
5
6
char szString[256] ;
char szTemp[] = "Hello, World!" ;
long iSize = strlen(szTemp);
 
*((long*)szString) = iSize ;
memcpy(szString+sizeof(iSize), szTemp, iSize+1) ;
0
paradise
11.04.2011, 10:57 #5
Не понятно, как данный код позволит изменить первые 5 байт:
C++
1
2
3
4
5
6
char szString[256] ;
char szTemp[] = 'Hello, World!' ;
long iSize = strlen(szTemp);
 
*((long*)szString) = iSize ;
memcpy(szString+sizeof(iSize), szTemp, iSize+1) ;
Этот код отводит под размер строки 4 байта (если в реализации long имеет длину 4 байта).
kpoxa
5 / 5 / 0
Регистрация: 08.12.2009
Сообщений: 213
11.04.2011, 11:26 #6
>> С 5-ю байтами я согласен. 1, 2, 4 байта пожалуйста, а вот 5 ?!

Естественно, что используется только 4 байта, об этом и должна была намекнуть эта строка!
0
kpoxa
5 / 5 / 0
Регистрация: 08.12.2009
Сообщений: 213
11.04.2011, 11:33 #7
К стати, paradise, вместо того, чтобы язвить, дал бе лучше человеку код.
Может он просто ошибся с 5-ю байтами, у всех могут быть очепятки!

P.S. Да и еще. long всегда 4-х байтный, это int зависит об платформы и может иметь длину 1, 2, 4, 8 и т.д. байт.
0
np_msn
0 / 0 / 0
Регистрация: 07.12.2010
Сообщений: 46
11.04.2011, 11:35 #8
Привет.
Если я правильно понял, есть что-то типа:
C++
1
char s[] = 'Hello, World!';
а нужно получить
C++
1
char d[] = '00013Hello, World!';
Это можно сделать так:
C++
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
#include <string.h>
int main()
{
    char s[] = 'Hello, World!';
    char d[256];
 
    sprintf(d, '%05d%s', strlen(s), s);
    return 0;
}
Удачи.
0
paradise
11.04.2011, 11:41 #9
>P.S. Да и еще. long всегда 4-х байтный, это int зависит об
>платформы и может иметь длину 1, 2, 4, 8 и т.д. байт.

Б. Страуструп 'Язык программирования С++' (спец. издание) стр.113:
[цитата]
... По поводу размеров фундаментальных типов гарантируется следующее:
sizeof(int) <= sizeof(long)
[/цитата]

Как в этом случае 'long всегда 4-х байтный, это int зависит ... 8 и т.д. байт' ?
paradise
11.04.2011, 12:21 #10
Код
 > sprintf(d, '%05d%s', strlen(s), s);
Не вижу смысла хранить длинну строки в текстовом формате. Тем более, что %05 указывает минимальное количество байт и если длинна строки будет больше 99999, то условия будут нарушены.

Если автор собирается хранить длинну строки в виде числа (длинной 5 байт), что , как было справедливо замечено выше почти всеми авторами, является по крайней мере странным, то автору не помешает:
- уточнить, как он собирается получать размер строки.
- пояснить, почему он использует именно массив char (C-строки) и почему в этом случае его не устраивает функция strlen.
- посмотреть в сторону строк С++ (string).
- запостить хотя бы кусочек кода. По крайней мере с объявлением этого массива, местом его инициализации и метом, в котором необходимо получить размер.

>К стати, paradise, вместо того, чтобы язвить, дал бе лучше человеку код.
>Может он просто ошибся с 5-ю байтами, у всех могут быть очепятки!

Кода тут и так достаточно. Автор задал слишком расплывчатый вопрос и можно бесконечно долго гадать, что же он хотел спросить. Вместо этого можно указать ему на ошибки в вопросе, он их поправит и это сбережет кучу времени и вам и мне и автору.
Tneiro_Odessa
0 / 0 / 0
Регистрация: 13.07.2010
Сообщений: 3
11.04.2011, 15:46 #11
если делать в студии то
CString str;
str.Fromat('%5d%s',/*переменая длины стоки*/,/*сама строка*/);
0
John Paramol
11.04.2011, 17:18 #12
если уж сильно нужно пятибайтовое целое, его можно сделать самому
C++
1
2
3
4
5
6
7
8
9
10
class int40
{
  BYTE data[5];
  public:
  int40() {}
  int40(__int64 p) { *this=p; }
  unsigned __int64 operator=(unsigned __int64 p)
  { memcpy(this,&p,sizeof(*this));  return p&0xFFFFFFFFFF; }
  operator __int64() { __int64 res=0;  memcpy(&res,this,sizeof(*this));  return res; }
};
теперь, например, в том куске кода заменим long:
C++
1
2
3
4
5
char szString[256];
char szTemp[] = 'Hello, World!';
int40 iSize = strlen(szTemp);
*((int40*)szString) = iSize;
memcpy(szString + sizeof(iSize), szTemp, iSize+1);
но только этот пример не дает преимуществ, из-за использования strlen и memcpy;
единственное, что теперь под размер отведется 5 байт, но сам размер не превысит диапазона unsigned int.
А вообще, мне тоже кажется, что автор имел в виду нечто иное
ahill_odessa
0 / 0 / 0
Регистрация: 09.04.2011
Сообщений: 6
11.04.2011, 21:53  [ТС] #13
С пятью байтами я действительно ошибся, длина будет 4. Насчёт строки типа char сорри, написал впопыхах . Будет буфер char *pszString, размер будет менятся. А хранить длину в буфере надо потому что буфер кодируется и предаётся на сервер, там раскодируется.
0
ahill_odessa
0 / 0 / 0
Регистрация: 09.04.2011
Сообщений: 6
11.04.2011, 21:54  [ТС] #14
В общем спасибо всем, уже получилось
0
11.04.2011, 21:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.04.2011, 21:54
Привет! Вот еще темы с ответами:

Замена одного слова на другое в строке типа char - C++
Замена одного символа на другой в строке типа char - C++ Вообщем есть массив символов char str = &quot;abcafgh&quot;; нужно все &quot;a&quot; заменить...

Добавление в массив типа char * одного элемента типа char - C++
Дан класс Строка, содержащий указатель на char - адрес динамически выделенной для размещения символов строки памяти и длину строки. Нужен...

Аргумент типа char** не совместим с параметром типа const char* - C++
Программа должна позволять заносить в структуру данные и выводить на экран информацию о поездах, следующих до определенной станции: ...

Аргумент типа char (*)[1000] несовместим с параметром типа char** - C++
Здравствуйте! Есть вот такая структура: #define max 1000 struct expr { char s; int index; };


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.