Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как в с_str() избавиться от const ? 
:(
    Опции темы
Гость05
Дата 25.10.2005, 09:04 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Привет, всем!

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

Спасибо
  Вверх
Neitron
Дата 25.10.2005, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 580
Регистрация: 3.10.2005
Где: Москва

Репутация: 2
Всего: 5



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

Это сообщение отредактировал(а) Neitron - 25.10.2005, 09:07


--------------------
Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей.
Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ
PM MAIL   Вверх
Mayk
Дата 25.10.2005, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



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

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

Код

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


Это сообщение отредактировал(а) Mayk - 25.10.2005, 09:59


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Vyacheslav
Дата 25.10.2005, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



Код

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



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Void
Дата 25.10.2005, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



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

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

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


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
srd
Дата 25.10.2005, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 27
Всего: 49



Я люблю 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


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
sergejzr
Дата 25.10.2005, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



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

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

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



--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
srd
Дата 25.10.2005, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 27
Всего: 49



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

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


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
Void
Дата 25.10.2005, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



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

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


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0558 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.