string -> char*
От: Аноним  
Дата: 19.02.05 09:45
Оценка:
Я извиняюсь, за глупый вопрос.
А можно ли получить указатель на сhar у string-а , куча ф-ций работают именно с масивами чаров ! Как быть ??
Re: string -> char*
От: Rinver  
Дата: 19.02.05 09:51
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Я извиняюсь, за глупый вопрос.

А> А можно ли получить указатель на сhar у string-а , куча ф-ций работают именно с масивами чаров ! Как быть ??

string a = "aaaaa";
const char* pa = a.c_str();
С уважением, Rinver.
Re: string -> char*
От: tarkil Россия http://5209.copi.ru/
Дата: 19.02.05 10:01
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Я извиняюсь, за глупый вопрос.

А> А можно ли получить указатель на с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

Неужели это не возможно.
Re[3]: string -> char*
От: grishaspivak Беларусь  
Дата: 19.02.05 10:15
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, 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.
Re[3]: string -> char*
От: tarkil Россия http://5209.copi.ru/
Дата: 19.02.05 10:26
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Да нет, мне нуген указатель не на временый буфер, а хочу его изменять.

А>Что-то вроде 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() — $))
Re[5]: string -> char*
От: tarkil Россия http://5209.copi.ru/
Дата: 19.02.05 10:52
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Понятно конечно могно сделать так, но как раз так мне и не хотелось делать, криво .

А>правда чем то похоже на 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.
--
wbr, Peter Taran
Re[4]: string -> char*
От: Анатолий Широков СССР  
Дата: 19.02.05 10:59
Оценка: +1
T>Если с грязными трюками, то resize до нужного кол-ва символов в буфере и передавайте адрес первого элемента: &s[0] или s.begin(). Потом уменьшите размер до нужной длины.

Такое пройдет для std::vector, но не для std::string, поскольку стандарт от std::string не требует непрерывного размещения представления в памяти, тогда как для std::vector такая гарантия есть.
Re[5]: string -> char*
От: tarkil Россия http://5209.copi.ru/
Дата: 19.02.05 11:06
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

АШ>Такое пройдет для std::vector, но не для std::string, поскольку стандарт от std::string не требует непрерывного размещения представления в памяти, тогда как для std::vector такая гарантия есть.


А ещё begin возвращает итератор, а не указатель на char. Говорю ж: трюки грязные и непереносимые

MS'овская реализация выделяет непрерывным куском (вроде б то как), на ней будет работать.
--
wbr, Peter Taran
Re[5]: string -> char*
От: tarkil Россия http://5209.copi.ru/
Дата: 19.02.05 11:08
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

АШ>Такое пройдет для std::vector, но не для std::string, поскольку стандарт от std::string не требует непрерывного размещения представления в памяти, тогда как для std::vector такая гарантия есть.


Кстати, подумалось, что есть тип итератора — char*, то можно быть увереным, что память выделяется непрерывным куском. На этом проверку времени компиляции можно построить.
--
wbr, Peter Taran
Re[3]: string -> char*
От: _nn_  
Дата: 19.02.05 11:53
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Rinver, Вы писали:


R>>Здравствуйте, Аноним, Вы писали:


А>>>Я извиняюсь, за глупый вопрос.

А>>> А можно ли получить указатель на сhar у string-а , куча ф-ций работают именно с масивами чаров ! Как быть ??

R>>string a = "aaaaa";

R>>const char* pa = a.c_str();

А>Да нет, мне нуген указатель не на временый буфер, а хочу его изменять.

А>Что-то вроде CString::GetBuffer

А>Неужели это не возможно.


Читать здесь
Автор: _nn_
Дата: 22.11.04
и здесь
Автор: _nn_
Дата: 26.07.04
.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[6]: string -> char*
От: MaximE Великобритания  
Дата: 20.02.05 10:36
Оценка:
tarkil wrote:

> Кстати, подумалось, что есть тип итератора — char*, то можно быть увереным, что память выделяется непрерывным куском. На этом проверку времени компиляции можно построить.


Не очень надежная проверка. В debug и release билдах типы итераторов могут различаться, как, например, в debug mode у STLPort.

--
Maxim Yegorushkin

Those who do not understand Unix are condemned to reinvent it, poorly. © Henry Spencer
Posted via RSDN NNTP Server 1.9
Re[7]: string -> char*
От: Аноним  
Дата: 21.02.05 04:42
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Не очень надежная проверка. В debug и release билдах типы итераторов могут различаться, как, например, в debug mode у STLPort.


Sure. Так ведь и механизм в целом на голову больной
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.