T>Если с грязными трюками, то resize до нужного кол-ва символов в буфере и передавайте адрес первого элемента: &s[0] или s.begin(). Потом уменьшите размер до нужной длины.
Такое пройдет для std::vector, но не для std::string, поскольку стандарт от std::string не требует непрерывного размещения представления в памяти, тогда как для std::vector такая гарантия есть.
string -> char*
От:
Аноним
Дата:
19.02.05 09:45
Оценка:
Я извиняюсь, за глупый вопрос.
А можно ли получить указатель на сhar у string-а , куча ф-ций работают именно с масивами чаров ! Как быть ??
Здравствуйте, Аноним, Вы писали:
А>Я извиняюсь, за глупый вопрос. А> А можно ли получить указатель на сhar у string-а , куча ф-ций работают именно с масивами чаров ! Как быть ??
Здравствуйте, Аноним, Вы писали:
А>Я извиняюсь, за глупый вопрос. А> А можно ли получить указатель на сhar у string-а , куча ф-ций работают именно с масивами чаров ! Как быть ??
Метод c_str в помощь.
--
wbr, Peter Taran
Re[2]: string -> char*
От:
Аноним
Дата:
19.02.05 10:04
Оценка:
Здравствуйте, Rinver, Вы писали:
R>Здравствуйте, Аноним, Вы писали:
А>>Я извиняюсь, за глупый вопрос. А>> А можно ли получить указатель на сhar у string-а , куча ф-ций работают именно с масивами чаров ! Как быть ??
R>string a = "aaaaa"; R>const char* pa = a.c_str();
Да нет, мне нуген указатель не на временый буфер, а хочу его изменять.
Что-то вроде CString::GetBuffer
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Rinver, Вы писали:
R>>Здравствуйте, Аноним, Вы писали:
А>>>Я извиняюсь, за глупый вопрос. А>>> А можно ли получить указатель на сhar у string-а , куча ф-ций работают именно с масивами чаров ! Как быть ??
R>>string a = "aaaaa"; R>>const char* pa = a.c_str();
А>Да нет, мне нуген указатель не на временый буфер, а хочу его изменять. А>Что-то вроде CString::GetBuffer
А>Неужели это не возможно.
Если хочешь изменять "руками" — пользуйся std::string::iterator или оператором []. Если принципиально хочешь пользоваться функциями из <string.h> — копируй содержимое строки в массив char и с ним работай — но проще пользваться алгоритмами и методами самого basic_string.
Здравствуйте, Аноним, Вы писали:
А>Да нет, мне нуген указатель не на временый буфер, а хочу его изменять. А>Что-то вроде CString::GetBuffer
А>Неужели это не возможно.
Безопасно и без использования "грязных трюков" невозможно. Используйте char tmp[NNN] нужного размера, который потом присваивайте string'у.
Если с грязными трюками, то resize до нужного кол-ва символов в буфере и передавайте адрес первого элемента: &s[0] или s.begin(). Потом уменьшите размер до нужной длины.
// не тестировано, так что author doesn't responsible for all possible problems
std::string s;
s.resize( MAX_PATH ); // столько символов в строке сейчас будет (без учёта нуля на конце)
LegacyFunc( s.begin() ); // передаём char*
s.resize( strlen( s.c_str() ) );
--
wbr, Peter Taran
Re[4]: string -> char*
От:
Аноним
Дата:
19.02.05 10:37
Оценка:
T>Безопасно и без использования "грязных трюков" невозможно. Используйте char tmp[NNN] нужного размера, который потом присваивайте string'у.
T>Если с грязными трюками, то resize до нужного кол-ва символов в буфере и передавайте адрес первого элемента: &s[0] или s.begin(). Потом уменьшите размер до нужной длины.
T>
T>// не тестировано, так что author doesn't responsible for all possible problems
T>std::string s;
T>s.resize( MAX_PATH ); // столько символов в строке сейчас будет (без учёта нуля на конце)
T>LegacyFunc( s.begin() ); // передаём char*
T>s.resize( strlen( s.c_str() ) );
T>
Спасибо,
Понятно конечно могно сделать так, но как раз так мне и не хотелось делать, криво .
правда чем то похоже на GetBuffer() — $))
Здравствуйте, Аноним, Вы писали:
А>Понятно конечно могно сделать так, но как раз так мне и не хотелось делать, криво . А>правда чем то похоже на GetBuffer() — $))
Дык, а legacy-функцию не обучишь тому, что ей даётся не буфер char'ов, а объект-строка. Она так не считает Поэтому любое решение неизбежно будет похоже на MFC'шное GetBuffer/Release. Кстати, мне нравится их концепция, что пока строку мучают в режиме "буфер char'ов" она как бы блокирована.
Можно и для STL обёртку сделать.
class StrAsCharArray
{
public:
typedef basic_string<char> ContainerString;
StrAsCharArray( ContainerString &Str, size_t BuffSize ) : m_Str( Str )
{
m_Str.resize( BuffSize ); // реально буфер минимум на один char длиннее - для нуля, ну и хрен с ним, надёжнее будет
}
char* str()
{ return m_Str.begin(); }
size_t buffsize()
{ return m_Str.size(); }
~StrAsCharArray()
{
m_Str.resize( strlen( m_Str.c_str() ) );
}
private:
ContainerString &m_Str;
};
...
// Usage
std::string s;
{
StrAsCharArray shell( s, MAX_PATH );
GetCurrentDirectory( shell.buffsize(), shell.str() );
}
// тут используем "хороший" s.
Здравствуйте, Анатолий Широков, Вы писали:
АШ>Такое пройдет для std::vector, но не для std::string, поскольку стандарт от std::string не требует непрерывного размещения представления в памяти, тогда как для std::vector такая гарантия есть.
А ещё begin возвращает итератор, а не указатель на char. Говорю ж: трюки грязные и непереносимые
MS'овская реализация выделяет непрерывным куском (вроде б то как), на ней будет работать.
Здравствуйте, Анатолий Широков, Вы писали:
АШ>Такое пройдет для std::vector, но не для std::string, поскольку стандарт от std::string не требует непрерывного размещения представления в памяти, тогда как для std::vector такая гарантия есть.
Кстати, подумалось, что есть тип итератора — char*, то можно быть увереным, что память выделяется непрерывным куском. На этом проверку времени компиляции можно построить.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Rinver, Вы писали:
R>>Здравствуйте, Аноним, Вы писали:
А>>>Я извиняюсь, за глупый вопрос. А>>> А можно ли получить указатель на сhar у string-а , куча ф-ций работают именно с масивами чаров ! Как быть ??
R>>string a = "aaaaa"; R>>const char* pa = a.c_str();
А>Да нет, мне нуген указатель не на временый буфер, а хочу его изменять. А>Что-то вроде CString::GetBuffer
А>Неужели это не возможно.
tarkil wrote:
> Кстати, подумалось, что есть тип итератора — char*, то можно быть увереным, что память выделяется непрерывным куском. На этом проверку времени компиляции можно построить.
Не очень надежная проверка. В debug и release билдах типы итераторов могут различаться, как, например, в debug mode у STLPort.
Здравствуйте, MaximE, Вы писали:
ME>Не очень надежная проверка. В debug и release билдах типы итераторов могут различаться, как, например, в debug mode у STLPort.
Sure. Так ведь и механизм в целом на голову больной