Значение string в const char* как???
От: Alexys Россия  
Дата: 11.05.11 07:42
Оценка:
День добрый!
Подскажите пожалуйста, как к const char* присвоить значение из string ???
const char* s_;
for (int i = 0; i<5; i++) //2. шаг. (в дебагге s_ уже пустой ((( ) 
{
    char* value = "1";
    string sValue(value);
    s_ = sValue.c_str(); 
} //1 шаг. (дебаггом смотрим, значение занеслом, переменная s_ содержит "1"


Что нужно??? Как правильно копировать значение строк???
Re: Значение string в const char* как???
От: dilmah США  
Дата: 11.05.11 08:04
Оценка:
Здравствуйте, 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 тоже перестает быть валидным
Re: Значение string в const char* как???
От: Uzumaki Naruto Ниоткуда  
Дата: 11.05.11 08:05
Оценка:
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 раз ?

Re: Значение string в const char* как???
От: Valen  
Дата: 11.05.11 08:05
Оценка:
Здравствуйте, 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.
Re[2]: Значение string в const char* как???
От: Alexys Россия  
Дата: 11.05.11 08:08
Оценка:
Здравствуйте, 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, без разницы) и вытаскивать значения в переменную массива струткуры...
Просто облегчил, для наглядности минимальный пример.
Re: Значение string в const char* как???
От: kvser  
Дата: 11.05.11 08:08
Оценка:
Здравствуйте, 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 будет вызван деструктор, то придется копировать.
Re[3]: Значение string в const char* как???
От: Uzumaki Naruto Ниоткуда  
Дата: 11.05.11 08:13
Оценка:
ну так под переменную надо выделить память — что бы копировать

Re: Значение string в const char* как???
От: Angler Россия  
Дата: 11.05.11 08:16
Оценка:
Здравствуйте, Alexys, Вы писали:


A>Что нужно??? Как правильно копировать значение строк???


А что тебе то самому нужно? Если просто "посмотреть", то это одно, а вот если сохранить, то это другое.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.