Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Как в с_str() избавиться от const ?


Автор: Гость05 25.10.2005, 09:04
Привет, всем!

народ подскажите, текст храниться в std::string его нужно от туда вытащить и поместить в char* проблема в том что std::string.c_str() возвращает const char* как избавиться от const ?

Спасибо

Автор: Neitron 25.10.2005, 09:07
Скопировать достаточно просто, ты скажи зачем.
А так смотри
strcpy

Автор: Mayk 25.10.2005, 09:57
АФАИР, c_str может быть копией исходной строки(если не ошибаюсь). А чтобы получить саму строку надо восползоваться
string::data.

А вообще действительно ли нужно одновременно использовать как char[] так и string?
Добавлено @ 09:58
да. ну и избавление от const.

Код

char* actualString = const_cast<char*>(str.data());

Автор: Vyacheslav 25.10.2005, 10:04
Код

    char* ch = const_cast<char*>(str.c_str());

Автор: Void 25.10.2005, 12:13
Цитата(Mayk @ 25.10.2005, 11:57)
АФАИР, c_str может быть копией исходной строки(если не ошибаюсь). А чтобы получить саму строку надо восползоваться
string::data.

Для data тоже никто не гарантирует, что это и есть тот самый underlying char array.

В любом случае, попытки избавиться от константности без копирования - это зло и желание нарваться на UB.

Автор: srd 25.10.2005, 13:09
Я люблю const_cast, он такой забавный:
Код

#include <cstdio>
#include <conio.h>

void f(const char& ch)
{
    const_cast<char&>(ch) = 'B'; // undefined behaviour
}

void g(const char &ch)
{
    printf("%c\n", ch);
}

int main(void)
{
    const char ch = 'A';
    f(ch);
    printf("%c\n", ch);
    g(ch);
    _getch();
}

Вывод в консоли (msvc 7.1):

A
B


Добавлено @ 13:10
Кстати, мне почему-то казалось, что во время выполнения этого кода будет access violation smile

Автор: sergejzr 25.10.2005, 13:32
Не, не будет "константность" проверяется только на момент компиляции и служит защитным мечанизмом против изменения значений переменных. Это однако не означает, что их изменения повлекут за собой "физические" ошибки. Скорее всего логические.
Проблема товарища мне представляется в другом. Компилятор не даёт передать массив в функцию.
Решение:

задекларировать функцию правильно, то есть
Код

void someFunc(char* cstr)
{
//....
}
void someConstFunc(const char* cstr)
{
//....
}
string test="123455";
someFunc(test.cstr()); //Здесь компилятор не даст этого сделать! 
someConstFunc(test.cstr()); //Всё ОК :)

Автор: srd 25.10.2005, 13:44
Цитата(sergej @ 25.10.2005, 21:32)
Не, не будет "константность" проверяется только на момент компиляции и служит защитным мечанизмом против изменения значений переменных. Это однако не означает, что их изменения повлекут за собой "физические" ошибки. Скорее всего логические.

Почему только логический? Если написано const int dummy = 0xff; то компилятор может соптимизировать эту инструкцию, и в результате такого объекта dummyв памяти может просто не существовать, а будет подставляться именно константа. Потому const_cast снимает действие const непонятно с чего, потому я предположил, что будет access violation.

Автор: Void 25.10.2005, 14:10
Цитата(srd @ 25.10.2005, 15:44)
Почему только логический? Если написано const int dummy = 0xff; то компилятор может соптимизировать эту инструкцию, и в результате такого объекта dummyв памяти может просто не существовать, а будет подставляться именно константа.

Компилятор имеет право подставить значение dummy, но выделить память под него он все равно обязан. Другой вопрос, он может это сделать это где-нибудь в read-only сегменте, и тогда можно нарваться на AV.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)