std::string

Тема в разделе "LANGS.C", создана пользователем Nafanya, 15 мар 2011.

  1. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    Возникла проблема со строками. Вообщем, в KDevelop при трассировке участка кода содержащего строку неверно отображается содержимое этой строки. Пример:

    Код (Text):
    1. string test;
    2. cout<<test.size()<<endl;
    3. test.append("hello\0name",10);
    4. cout<<test.size()<<endl;
    5. cout<<test<<endl;
    При пошаговой трассировке для переменной test будет отображено значение "hello", которое не соответствует действительности. Какие есть варианты решения этой проблемы для KDevelop?
     
  2. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Nafanya
    \0 в строке с какой целью? учитывая что это обозначение конца строки, да и вообще
    просто убивают такие фразы.
     
  3. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.242
    при чем тут KDevelop?

    у этого автора обычно нет цели, кроме как генерировать стремный код)

    Код (Text):
    1. #include <iostream>
    2. #include <string>
    3.  
    4. using namespace std;
    5.  
    6. int main()
    7. {
    8.     string test;
    9.     cout << test.size() << "\n";
    10.     test.append("hello\0name", 10);
    11.     cout << test.size() << "\n";
    12.     cout << test << "\n";
    13.     return 0;
    14. }
    компилятор MinGW:
    кстати такой нехилый потенциальный баг может быть из-за этого... gcc в данном случае поступает более здраво на мой взгляд)
     
  4. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Rel
    хотя если KDevelop еще до компиляции обрубает строки по \0 может и причем, но я хз.
     
  5. Ursus

    Ursus Member

    Публикаций:
    0
    Регистрация:
    15 мар 2006
    Сообщения:
    238
    Адрес:
    Russia
    KDevelop ни при чём. std::cout не обязан выводить строки, содержащие NULL, полностью.
     
  6. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    spa
    В строке лежит сетевой пакет. Соответственно под \0 - подразумеваются нулевые байты сетевого пакета.
    При отладке KDevelop отображает пакет неправильно.
    cout<<variable выводит его без нулевых байтов.
    функцию c_str() просьба не предлагать,хоть char'овский буфер отладчик KDevelop отображает корректно, этот вариант не подходит.

    Есть ли другие варианты?
     
  7. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.242
    да это вряд ли... как ide может так код резать?

    не валять дурака и не использовать контейнер для нуль-терминированных строк для формирования сетевого пакета... и тем более не выводить их с помощью cout...
     
  8. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    Мне во время отладки нужно точно знать, что записано в string, включая нуль-байты (т.к. там пакет). Буду думать дальше... Всем спасибо за советы.
     
  9. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    программирование не для слабых.
     
  10. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Nafanya
    Как отметил Rel std::string предназначен для ASCIIZ строк. Вам же нужен буфер данных. Попробуйте vector<char>.
     
  11. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    KeSqueer

    Разве? Мне как-то казалось, что нулем должен заканчиваться только результат c_str(). В остальных случаях ноль на конце никто (вроде бы!) не гарантирует.
     
  12. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Нет, string - это контейнер для объектов произвольного типа.
    Просто заточен под операции, характерные для строк символов.
    Nafanya
    Думаю, дело в KDevelop. Придётся подсунуть в cout свою реализацию streambuf, который бы заменял при выводе '\0' на пробел.
     
  13. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Само название как бы намекает, но Вам виднее, в C++ я, можно сказать, профан.
     
  14. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.242
    нет... с чего вы вообще это берете? string - контейнер для объектов типа char...
    Код (Text):
    1. typedef basic_string<char> string
    нет... при чем тут KDevelop? как IDE может влиять на это?

    +1
     
  15. rat4

    rat4 Member

    Публикаций:
    0
    Регистрация:
    13 сен 2005
    Сообщения:
    30
    Nafanya, багрепорт уже отправил?
     
  16. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Rel
    Я имел в виду не конкретно std::string, а строковой шаблонный класс вообще - т.е. std::basic_string.
    Содержимое std::string тоже не ограничивается C-строками - это может быть произвольный набор значений типа char, включая нули.

    При том, что именно IDE занимается выводом того, что отлаживаемая прога пишет в cout.
     
  17. Ursus

    Ursus Member

    Публикаций:
    0
    Регистрация:
    15 мар 2006
    Сообщения:
    238
    Адрес:
    Russia
    Ну надо же! Всю жизнь думал, что cout по дефолту направляется в консоль операционки, а оно вон как, оказывается!
     
  18. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    Ursus
    По дефолту cout направлен в STDOUT_FILENO. А уж что там под STDOUT_FILENO на самом деле -- навскидку не угадаешь. Может быть консоль, терминал, псевдотерминал, пайп, фифо, регулярный файл, сокет...
     
  19. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.242
    можно стандартные потоки перенаправить в пайпы и писать/читать их... в чтении из пайпа проблем не должно быть, проблема может быть к выводе текста на контрол, но это надо смотреть исходники KDevelop... если я правильно понял о чем пишет green... то есть если эти ошибки возникают в окошке KDevelop, а не в окошке консоля...
     
  20. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    Еще есть вопрос к знатокам потоков (cin,cout). Возможно ли "секретным:)" флагом переключить cin на неблокируемый ввод? Например,
    Код (Text):
    1. string str;
    2. while(true)
    3. {
    4. cin>>str;
    5. //прочий код
    6. }
    - чтобы программа не блокировалась в этом месте кода в случае отсутствия данных. Как только user введет строку и нажмёт Enter, записать это дело в string (например это может случиться на тысячном пробеге цикла).