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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> конец строки 
:(
    Опции темы
Romikgy
Дата 9.8.2006, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



если полазить по файлу basi_string.h
то увидим что метод c_str()
возвращает
Код

const _CharT*
      c_str() const { return _M_data(); }

Код

_CharT*
      _M_data() const
      { return  _M_dataplus._M_p; }

Код

 mutable _Alloc_hider    _M_dataplus;
struct _Alloc_hider : _Alloc
      {
    _Alloc_hider(_CharT* __dat, const _Alloc& __a)
    : _Alloc(__a), _M_p(__dat) { }

    _CharT* _M_p; // The actual data.
      };

Отселя вывод этот метод возвращает сугубо указатель , и о нуле в конце не беспокоится!


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
bel_nikita
Дата 9.8.2006, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

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



Так это уже конкретная интерпретация std::string'а smile 
Приведу цитату:
Цитата
Следует помнить, что в строках не существует специальной интерпретации символа \0, который в традиционных Си-строках является признаком конца строки. Символ \0 может входить в строки на равне с любым другим символом. Для этого в классе string были определены специальные функции для создания или записи/копирования Си-строк. В частности, c_str() переводит в содержимое строки в формат Си-строки.



--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Daevaorn
Дата 9.8.2006, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

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



Цитата(bel_nikita @  9.8.2006,  16:19 Найти цитируемый пост)
В идеале, для st[0]='x'; st[2]='y'; st[1]='z'; st[3]='\0'; нужно пользовать vector

Но то что это изменяет строку, ты отрицать не будешь? Для того ссылка и возвращается и логично срабатывает: "std::cout << st[0];"
Цитата(bel_nikita @  9.8.2006,  16:19 Найти цитируемый пост)
 А то, что не срабатывает std::cout << st; - лишь тому доказательство

Виной тому скорей всего, то что std::string кеширует размер содержащийся строки (этого напрямую нет в стандарте, но там (помойму) написаночто size() и length() должны вополняться за константное время). И std::cout вначале смотрит на std::string::length(), а уж потом выводит, если надо. Т.к. инициализации не было, то std::string::length()==0

smile
PM MAIL WWW   Вверх
bel_nikita
Дата 9.8.2006, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

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



Daevaorn,
Дело в том, что [] не проверяет правильность индекса. И поэтому операции вида  st[0]='x'; без резервирования памяти приводят к непредсказуемым последствиям. Что мы и наблюдаем smile Вот, вначале проделываем операцию st[0]='x'; А пишем то куда? Кто сказал, что пишем в string? Ведь память для string'а не резервировали.


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Romikgy
Дата 10.8.2006, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



Цитата(bel_nikita @  9.8.2006,  16:04 Найти цитируемый пост)
Так это уже конкретная интерпретация std::string'а 

покажи другую , где 
Цитата(bel_nikita @  9.8.2006,  16:04 Найти цитируемый пост)
 c_str() переводит в содержимое строки в формат Си-строки.




--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
bel_nikita
Дата 10.8.2006, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

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



Цитата(Romikgy @ 10.8.2006,  07:48)
покажи другую , где 
Цитата(bel_nikita @  9.8.2006,  16:04 Найти цитируемый пост)
 c_str() переводит в содержимое строки в формат Си-строки.

Лушче возьми и почитай для чего в std::string предусмотрен метод c_str().тута на англицком немного написано, что такое c_str() и для чего оно нужно

Ну, и вот на закуску: (STLport)
Код
  std::string Data;
  Data.resize(6);

  Data[0] = '1';
  Data[1] = '2';
  Data[2] = '3';
  Data[3] = '\0';
  Data[4] = '4';
  Data[5] = '5';
  
  std::cout<<Data;   // выводит:123 45



--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Romikgy
Дата 10.8.2006, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



bel_nikita, это немного не то, 
Цитата(bel_nikita @  10.8.2006,  10:22 Найти цитируемый пост)
 std::string Data;  Data.resize(6);  Data[0] = '1';  Data[1] = '2';  Data[2] = '3';  Data[3] = '\0';  Data[4] = '4';  Data[5] = '5';    std::cout<<Data; 

здесь надо смотреть как организовано вывод 
Цитата(bel_nikita @  10.8.2006,  10:22 Найти цитируемый пост)
 std::string

с помощью
Цитата(bel_nikita @  10.8.2006,  10:22 Найти цитируемый пост)
<<

и так 
std::cout<<Data.c_str(); 
нормально выводит
Код

For compatibility with "older" code, including some C++ library routines, it is sometimes necessary to convert a string object into a pointer to a null-terminated character array ("C-style string"). 

ты это имел ввиду?

Добавлено @ 13:15 
Код

template <class _CharT, class _Traits, class _Alloc>
basic_ostream<_CharT, _Traits>& _STLP_CALL
operator<<(basic_ostream<_CharT, _Traits>& __os, 
           const basic_string<_CharT,_Traits,_Alloc>& __s)
{

  _STLP_USING_IO
  typedef basic_ostream<_CharT, _Traits> __ostream;
  typename __ostream::sentry __sentry(__os);
  bool __ok = false;

  if (__sentry) {
    __ok = true;
    size_t __n = __s.size();
    size_t __pad_len = 0;
    const bool __left = (__os.flags() & __ostream::left) != 0;
    const size_t __w = __os.width(0);
    basic_streambuf<_CharT, _Traits>* __buf = __os.rdbuf();

    if (__n < __w) {
      __pad_len = __w - __n;
    }
    
    if (!__left)
      __ok = __stlp_string_fill(__os, __buf, __pad_len);    

    __ok = __ok && (__buf->sputn(__s.data(), streamsize(__n)) == streamsize(__n));

    if (__left)
      __ok = __ok && __stlp_string_fill(__os, __buf, __pad_len);
  }

  if (!__ok)
    __os.setstate(__ostream::failbit);

  return __os;
}

Если видишь здесь копируется не обращая внимание ни на нули ни на что , а просто объем, было 6 символов и все 6 запихнули в поток


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

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

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

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

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

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


 




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


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

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