Здравствуйте, Alexys, Вы писали:
A>День добрый! A>Подскажите пожалуйста, как к const char* присвоить значение из string ??? A>
A>const char* s_;
A>for (int i = 0; i<5; i++) //2. шаг. (в дебагге s_ уже пустой ((( )
A>{
A> char* value = "1";
A> string sValue(value);
A> s_ = sValue.c_str();
A>} //1 шаг. (дебаггом смотрим, значение занеслом, переменная s_ содержит "1"
A>
A>Что нужно??? Как правильно копировать значение строк???
у тебя же sValue разрушается на каждой итерации цикла -- указатель который ты из него выделил c_str тоже перестает быть валидным
1. Когда указываете указатеоль — это указатель — это адрес — адрес ячейки памяти — если его не проинициализировать — то он будет указывать х.з. знает куда.
2. Если есть указатель на блок памяти — то вполне логично, что нужно выделить под этот блок память — сделать это можно двумя пустями — на стеке — например char _s[255] или в куче malloc или char * _s = new char [255]
3. копирование строк осуществляется командой strcpy
итак из вашего кода мы получаем
char _s[2]; \\ два байта — первый под 1, другой под \0 — символ конца строки
const char* value = "1";
strcpy (&_s[0], value);
4. зачем вам цикл? что бы выполнить одну и туже операцию 5 раз ?
Здравствуйте, Alexys, Вы писали:
A>Что нужно??? Как правильно копировать значение строк??? A>
A>std::string s_;
A>for (int i = 0; i<5; i++) //2. шаг. (в дебагге s_ уже пустой ((( )
A>{
A> char* value = "1";
A> string sValue(value);
A> s_ += sValue.c_str();
A>} //1 шаг. (дебаггом смотрим, значение занеслом, переменная s_ содержит "1"
A>
Если правильно понял, то нужно сделать deepcopy. или через string, или ручками выделить память для char* s_ и вызвать strcat.
Здравствуйте, Uzumaki Naruto, Вы писали:
UN>1. Когда указываете указатеоль — это указатель — это адрес — адрес ячейки памяти — если его не проинициализировать — то он будет указывать х.з. знает куда. UN>2. Если есть указатель на блок памяти — то вполне логично, что нужно выделить под этот блок память — сделать это можно двумя пустями — на стеке — например char _s[255] или в куче malloc или char * _s = new char [255] UN>3. копирование строк осуществляется командой strcpy
UN>итак из вашего кода мы получаем
UN>char _s[2]; \\ два байта — первый под 1, другой под \0 — символ конца строки UN>const char* value = "1"; UN>strcpy (&_s[0], value);
UN>4. зачем вам цикл? что бы выполнить одну и туже операцию 5 раз ?
Цикл для наглядности...
Под циклом подразумевается хождение по N записям (или в бд или по xml, без разницы) и вытаскивать значения в переменную массива струткуры...
Просто облегчил, для наглядности минимальный пример.
Здравствуйте, Alexys, Вы писали:
A>День добрый! A>Подскажите пожалуйста, как к const char* присвоить значение из string ??? A>
A>const char* s_;
A>for (int i = 0; i<5; i++) //2. шаг. (в дебагге s_ уже пустой ((( )
A>{
A> char* value = "1";
A> string sValue(value);
A> s_ = sValue.c_str(); /// s_ - указывает на внутренний массив sValue, который гарантированно не меняется до следующего вызова не константного члена
A>} //1 шаг. после этого шага sValue уничтожается вместе со всеми своими внутренними данными
A>
Используйте:
1) Можно использовать strcpy(s_, sValue.c_str()); В s_ будет записано sValue.size() байт + 1 для завершающего нуля.
2) Использовать sValue.copy(s_, sValue.size(), 0); После в s_ не будет завершающего нуля
Общий минус этих двух способов в том, что перед копированием необходимо следить, чтобы s_ указывало на выделенную память достаточного размера для размещения sValue.c_str();
3) Не использовать const char* s_, а обходитьяс только std::srting объектами.
Если необходимо затем вызывать синхронную(блокирующую)системную функцию, принимающую const char* s_, то передавать в нее конечное вычисленное значение sValue.c_str() Если вызываемая функция будет использовать данные в отдельном потоке, который может завершится прежде, чем для sValue будет вызван деструктор, то придется копировать.