Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа со строками содержащами байт x00, компилятор обрывает строку 
:(
    Опции темы
fire64
Дата 18.10.2008, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 18.7.2007

Репутация: нет
Всего: нет



Код у меня конечно другой, но это ничего не меняет

Код



char text[2048];
text = "\xFF\xFF\x00\xFF"

char * pch;
pch = strtok (text," ,.-");


for(int i=0;i<n;i++)
{

    
    
    if  ( i % 16 == 0)
    {

    printf("\n");

    }
    
    else    
    {


    printf ("%s\n",pch);
    pch = strtok (NULL, " ,.-");

    }    
    
}




в результате строка обрывается там где встречается байт x00
PM MAIL   Вверх
Sartorius
Дата 18.10.2008, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 8
Всего: 37



fire64, чего же ты хочешь ? так и должно быть - C работает с z - строками. Не нравится ноль как терминатор строки - пиши свои функции для работы со своим форматом строк
PM MAIL ICQ   Вверх
fire64
Дата 18.10.2008, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 18.7.2007

Репутация: нет
Всего: нет



и что в C++ нет абсолютно никаких методов для работы с такими строками ?
PM MAIL   Вверх
Mayk
Дата 18.10.2008, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(fire64 @  18.10.2008,  21:21 Найти цитируемый пост)
и что в C++ нет абсолютно никаких методов для работы с такими строками ? 

std::string

Добавлено через 13 секунд
он не использует \0  как терминатор строки.


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
fire64
Дата 18.10.2008, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 18.7.2007

Репутация: нет
Всего: нет



Mayk, нефига не работает

к тому коду что в первом посте добавил

std::string new_str( text);
printf ("%s", new_str);

для того что бы вывести на экран строку с x00 пришлось написать этот кошмарный код

Код

for(int i=0;i<n;i++)
{

    
    
    if  ( i % 16 == 0)
    {

    }
    
    else    
    {


    printf ("%c", text[i]);

    }    
    
}



но вот теперь вопрос, как преобразовать "%c", text[i] в единую строку ?



Это сообщение отредактировал(а) fire64 - 18.10.2008, 19:08
PM MAIL   Вверх
vinter
Дата 18.10.2008, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Код

std::string new_str( text);
std::cout << new_str;



--------------------
Мой блог
PM MAIL WWW   Вверх
fire64
Дата 18.10.2008, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 18.7.2007

Репутация: нет
Всего: нет



Цитата(vinter @ 18.10.2008,  18:56)
Код

std::string new_str( text);
std::cout << new_str;



и в результате блин опять обрезается на первом x00 байте

как я уже говорил единственный способ вывода полной строки это

Код

for(int i=0;i<n;i++)
{
    
    
    if  ( i % 16 == 0)
    {
    }
    
    else    
    {
    printf ("%c", text[i]);
    }    
    
}


что бы справиться с мой проблемой надо каким-то образом, объединить все "%c", text[i] в одну строку
иначе строка будет обрезаться




PM MAIL   Вверх
586
Дата 18.10.2008, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 10
Всего: 146



Цитата(fire64 @  18.10.2008,  20:07 Найти цитируемый пост)
и в результате блин опять обрезается на первом x00 байте

Код
#include <iostream>

int main(int argc, char* argv[])
{
    char data[] = "\xFF\xFF\x00\xFF";

    std::string s(data, &data[sizeof(data)-1]);
    // data - начало данных
    // &data[sizeof(data)-1] - конец данных

    /*
    std::string s;
    s.assign(data, &data[sizeof(data)-1]);
    */

    std::cout << "size: " << s.size() << std::endl;
    std::cout << std::hex;

    for(std::string::iterator i = s.begin(); i != s.end(); ++i)
        std::cout << (((int)(*i)) & 0xFF) << ' ';

    std::cout << std::dec;
    std::cin.get();

    return 0;
}

PM   Вверх
fire64
Дата 18.10.2008, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 18.7.2007

Репутация: нет
Всего: нет



и в результате вместо текста из text
я получай вот это

Код

size: 2047
ff ff ff ff 6d 39 32 2e 32 34 31 2e 31 38 35 2e 32 33 3a 32 37 30 31 37 0 41 6e
74 69 63 68 61 74 20 7c 20 54 68 65 20 4d 61 66 69 61 0 73 75 72 66 5f 73 69 6d
70 73 6f 6e 73 5f 66 69 6e 61 6c 0 63 73 74 72 69 6b 65 0 43 6f 75 6e 74 65 72 2
d 53 74 72 69 6b 65 0 3 12 2f 64 6c 1 1 77 77 77 2e 63 6f 75 6e 74 65 72 2d 73 7
4 72 69 6b 65 2e 6e 65 74 0 0 0 1 0 0 0 0 9e f7 a 0 1 0 0 cc cc cc cc cc cc cc c
c cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc c
c cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc c
c cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc c
c cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc c
c cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc c
c cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc c
c cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc c
c cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc c
c cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc c
c cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc c
c cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc c
c cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc c
c cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc c
c cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc c
c cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc c
c cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc c
c cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc c
c cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc c
c cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc c
c cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc c
c cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc c
c cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc c
c cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc c
c cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc
 cc cc cc cc cc cc cc cc cc cc cc cc cc




Это сообщение отредактировал(а) fire64 - 18.10.2008, 20:36
PM MAIL   Вверх
J0ker
Дата 18.10.2008, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 4
Всего: 14



у меня выводит
Код

size: 4
ff ff 0 ff

что совершенно правильно
у вас библиотеки какие-то кривые...


--------------------
user posted image
PM MAIL   Вверх
fire64
Дата 19.10.2008, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 18.7.2007

Репутация: нет
Всего: нет



Цитата(J0ker @ 18.10.2008,  21:25)
у меня выводит
Код

size: 4
ff ff 0 ff

что совершенно правильно
у вас библиотеки какие-то кривые...

дело не в этом
просто у меня прога с сокетами
размер буфера составляет 2048
но не факт, что пакет помещённый в буфер будет иметь именно этот размер
PM MAIL   Вверх
J0ker
Дата 20.10.2008, 00:30 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 4
Всего: 14



тогда вы неправильно поставили нам задачу
буфер это буфер, а строка это строка - не надо их мешать в кучу
принимаете буфер, потом парсаете
не забудьте только, что если у вас TCP то пакеты могут по дороге фрагментироваться
а если UDP - то доставка и последовательность не гарантированны.


--------------------
user posted image
PM MAIL   Вверх
Earnest
Дата 20.10.2008, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Все уже тебе написали.
Цитата(fire64 @  18.10.2008,  20:07 Найти цитируемый пост)
std::string new_str( text);

Вот здесь уже обрезается, и не поможет тебу string, т.к. при конструировании принимается именно z-cтрока.

Цитата(fire64 @  18.10.2008,  19:08 Найти цитируемый пост)
for(int i=0;i<n;i++)

Если ты знаешь n, то зачем тебе строки? Работай с байтами и не морочь голову.

Цитата(fire64 @  19.10.2008,  23:18 Найти цитируемый пост)
но не факт, что пакет помещённый в буфер будет иметь именно этот размер 

Значит, должен быть способ определения размера пакета, и никак не по 0-символу.



--------------------
...
PM   Вверх
J0ker
Дата 20.10.2008, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 4
Всего: 14



Цитата(Earnest @  20.10.2008,  14:52 Найти цитируемый пост)
Все уже тебе написали.
Код

std::string new_str( text);

Вот здесь уже обрезается, и не поможет тебу string, т.к. при конструировании принимается именно z-cтрока.


там дальше конструктор от двух итераторов (поинтеров) - так ничего не обрезается



--------------------
user posted image
PM MAIL   Вверх
Earnest
Дата 20.10.2008, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



А, в чьем-то примере? Да, не заметила. Но вопрос не в этом: да,  можно засунуть это в string - только зачем? 


--------------------
...
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0592 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.