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

Поиск:

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


Новичок



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

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



какой символ определяет конец строки

    std::string st;
    st[0]='x';
    st[2]='y';
    st[1]='z';
    st[3]='\0';
     

std::cout << st; выводит пустую строку;
std::cout << st[0] выведит 'x', аналогично st[1] и st[2].

Это сообщение отредактировал(а) skrip - 8.8.2006, 10:30
PM MAIL   Вверх
Romikgy
Дата 8.8.2006, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



st="xyz";
так нельзя?



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

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


Новичок



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

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



нужно именно посимвольно как я написал smile 
PM MAIL   Вверх
Romikgy
Дата 8.8.2006, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



тогда имхо сначало надо выделить память под переменную может это юзать
str.resize(4);
а уж потом посимвольно

Добавлено @ 11:52 
Код

std::string st;
st.resize(4);    
st[0]='x';    
st[2]='y';    
st[1]='z';    
st[3]='\0';     
std::cout << st; 
std::cout << st[0]; 

У меня работает


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

PM   Вверх
Mayk
Дата 8.8.2006, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Ну или
string st;
st.push_back('1');
st.push_back('2');
st.push_back('3');
и не хай с++ сам длину строки высчитывает.



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


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



ну или
Код

string st;
st+='x';
st+='y';
...

 smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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


Новичок



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

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



всем спасибо
я придумал нижний способ
просто хотел узнать символ конца строки string

Это сообщение отредактировал(а) skrip - 8.8.2006, 17:20
PM MAIL   Вверх
Romikgy
Дата 8.8.2006, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(skrip @  8.8.2006,  16:16 Найти цитируемый пост)
просто хотел узнать символ конца строки string

0


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

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


Новичок



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

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



ну а тогда почему вот это не работает?

   std::string st;
    st[0]='x';
    st[2]='y';
    st[1]='z';
    st[3]='\0';

оператор << значит подругому определяет конец строки string
PM MAIL   Вверх
Daevaorn
Дата 9.8.2006, 07:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(skrip @  9.8.2006,  08:11 Найти цитируемый пост)
ну а тогда почему вот это не работает?

тебе уже здесь сказали что надо добавить st.resize(4);
PM MAIL WWW   Вверх
Romikgy
Дата 9.8.2006, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(skrip @  9.8.2006,  06:11 Найти цитируемый пост)
 std::string st;

потому что в этой строке указывается что будет переменая типа стринг но нулевой длины, и сам понимаешь что будет при передаче данных в неинициализированый массив данных
PS тип стринг это динамическая строка, в простейшем случае типа char 


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

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


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата

PS тип стринг это динамическая строка, в простейшем случае типа char  

Код

typedef std::basic_string<char> std::string;

так что std::string - это и есть частный случай


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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


Эксперт
****


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

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



Цитата(skrip @ 8.8.2006,  09:21)
какой символ определяет конец строки

    std::string st;
    st[0]='x';
    st[2]='y';
    st[1]='z';
    st[3]='\0';
     

std::cout << st; выводит пустую строку;
std::cout << st[0] выведит 'x', аналогично st[1] и st[2].

не совсем рабочий пример smile 
как указали выше нужен ресайз. оператор [] возвращает адрес и не более того, присваивание в этом случае не влечет за собой изменение каких-либо переменных в std::string. поэтому в данном случае нужен след. вывод:
Код

std::cout << str.c_str(); // выводит строку;



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


Эксперт
****


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

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



Цитата(bel_nikita @  9.8.2006,  13:52 Найти цитируемый пост)
оператор [] возвращает адрес и не более того

Он возвращает ссылку, а это уже о-го-го более того, и что самое интересное этого достаточноsmile

Цитата(bel_nikita @  9.8.2006,  13:52 Найти цитируемый пост)
std::cout << str.c_str(); // выводит строку;

В идеале и этот код и все предыдущие должны работать идентично.
PM MAIL WWW   Вверх
bel_nikita
Дата 9.8.2006, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Daevaorn @ 9.8.2006,  12:51)
Цитата(bel_nikita @  9.8.2006,  13:52 Найти цитируемый пост)
std::cout << str.c_str(); // выводит строку;

В идеале и этот код и все предыдущие должны работать идентично.

В идеале, для st[0]='x'; st[2]='y'; st[1]='z'; st[3]='\0'; нужно пользовать vector smile  Только реализация std::vector гарантирует (&v[0] + 5) == &v[5]
И где сказано, что данные в std::string обязаны оканчиваться "\0" и располагаться последовательно? А вот, как раз str.c_str() и возвращает Си-строку, которая заканчивается на "\0". А то, что не срабатывает std::cout << st; - лишь тому доказательство smile 



--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
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   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.1226 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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