Форум программистов, компьютерный форум CyberForum.ru

Вернуть С-строку из обьекта класса - C++

Восстановить пароль Регистрация
 
i8086
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 9
16.07.2013, 14:51     Вернуть С-строку из обьекта класса #1
Есть класс, у него метод c_str. Какой лучший способ вернуть С-строку?
1)
C++
1
2
3
void c_str(char* str) {
// сформировать строку и записать в str
}
2)
C++
1
2
3
4
5
char* c_str(void) {
static char str[255];
// сформировать строку и записать в str
return str;
}
Другие способы?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
16.07.2013, 14:57     Вернуть С-строку из обьекта класса #2
Лучше в классе хранить char *str, в c_str() выделять под него память и его же возвращать и в деструкторе не забыть освободить занимаемую им память. А вообще без контекста сложно сказать.
ViktorKozlov
133 / 125 / 2
Регистрация: 13.12.2012
Сообщений: 293
16.07.2013, 14:58     Вернуть С-строку из обьекта класса #3
Можно и без static
C++
1
2
3
4
5
char* c_str(void) {
char* str=new char[255];
// сформировать строку и записать в str
return str;
}
i8086
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 9
16.07.2013, 15:08  [ТС]     Вернуть С-строку из обьекта класса #4
А если строка каждый раз меняется, память выделять только один раз?
Т. е. как такой вариант?
C++
1
2
3
4
5
6
7
8
9
10
char* c_str(void) {
// str - member
if(nullptr != str) {
     str=new char[255];
}
// сформировать строку и записать в str
return str;
}
 
// в десрукторе освободить память
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,829
Записей в блоге: 2
Завершенные тесты: 1
16.07.2013, 15:10     Вернуть С-строку из обьекта класса #5
Если имеется ввиду объект класса на подобии std::string, то можно в конец строки(если буфера хватает) дописать '\0' и вернуть указатель на строку:
C++
1
2
3
const char * c_str(){
//...
}
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
16.07.2013, 16:26     Вернуть С-строку из обьекта класса #6
Цитата Сообщение от Croessmah Посмотреть сообщение
Если имеется ввиду объект класса на подобии std::string
то там уже хранится 0 в конце.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,829
Записей в блоге: 2
Завершенные тесты: 1
16.07.2013, 16:33     Вернуть С-строку из обьекта класса #7
Цитата Сообщение от Tulosba Посмотреть сообщение
то там уже хранится 0 в конце.
но это же не обязательно, поэтому и написал, чтобы присвоили
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
16.07.2013, 20:11     Вернуть С-строку из обьекта класса #8
Цитата Сообщение от i8086 Посмотреть сообщение
void c_str(char* str) {
// сформировать строку и записать в str
}
Если класс сам по себе не хранит строку, а генерирует её по запросу, то лучше так.
Если это нечто вроде std::string, который внутри хранит эту строку, то лучше const char * c_str()

Добавлено через 15 минут
Вообще, не стоит забывать, что string::c_str очень специфичная функция, возвращающая временный указатель на С-строку, который крайне вероятно станет невалидным после почти любого действия со строкой.
поэтому, в любом случае, при получении С-строки из string
если расчитываешь где-то ею долго и надёжно пользоваться,
необходимо срочно скопировать эту результат, полученный из c_str() в свой надёжно выделенный в памяти массив char
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
16.07.2013, 20:29     Вернуть С-строку из обьекта класса #9
Kuzia domovenok, const функции можно использовать и не прибегая к предварительному копированию буфера.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
16.07.2013, 20:51     Вернуть С-строку из обьекта класса #10
Цитата Сообщение от Tulosba Посмотреть сообщение
Kuzia domovenok, const функции можно использовать и не прибегая к предварительному копированию буфера.
Tulosba, смотря как использовать.
Захотел я просто вывести строку через сишный указатель. Пожалуйста!
C++
1
2
std::string s("Hello");
std::cout<<s.c_str();//всё ОК!
Захотел я Сделать то же самое, но чуть попозже:
C++
1
2
3
4
5
6
7
8
std::string s("Hello");
const char* ptr=s.c_str();//Запомним c_str() и подождём;
...//ещё подождём
s="YOUR STRING IS DOOMED! MU-HA-HA!";//(А тем временем, пока мы ждём!)
//И вспомним про указатель. 
//(КОНСТАНТНЫЙ!)мы ни его ни в нём ничего не меняли ж
std::cout<<ptr;
//АХТУНГ!!!!!
Добавлено через 13 минут
Цитата Сообщение от Tulosba Посмотреть сообщение
const функции можно использовать и не прибегая к предварительному копированию буфера.
Tulosba, кстати, а что ты имел в виду под "конст-функциями"?
То, что это const char* c_str() const;
Или то, что это const char* c_str() const;
Первое запрещает получателю c_str() менять данные в буфере, но этот буфер сам может измениться у отправителя, как в примере выше.
Второе вообще лишь говорит нам, что метод c_str может вызываться не только у строковых переменных, но и у констант (const std::string s и к теме не имеет отношения.
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
16.07.2013, 21:25     Вернуть С-строку из обьекта класса #11
Kuzia domovenok, я имел в виду функции, которые не изменяют состояние объекта. length(), capacity(), find() и т.д.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
16.07.2013, 21:29     Вернуть С-строку из обьекта класса #12
Цитата Сообщение от Tulosba Посмотреть сообщение
Kuzia domovenok, я имел в виду функции, которые не изменяют состояние объекта. length(), capacity(), find() и т.д.
Состояние объекта они не изменяют. Зато состояние возвращённого c_str указателя может внезапно измениться вообще на невалидное.
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
16.07.2013, 21:34     Вернуть С-строку из обьекта класса #13
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Зато состояние возвращённого c_str указателя может внезапно измениться вообще на невалидное.
Пруф?
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
16.07.2013, 21:38     Вернуть С-строку из обьекта класса #14
Цитата Сообщение от Tulosba Посмотреть сообщение
Пруф?
Пост 10!!!!!
C++
1
2
3
4
5
6
7
8
std::string s("Hello");
const char* ptr=s.c_str();//Запомним c_str() и подождём;
...//ещё подождём
s="YOUR STRING IS DOOMED! MU-HA-HA!";//(А тем временем, пока мы ждём!)
//И вспомним про указатель. 
//(КОНСТАНТНЫЙ!)мы ни его, ни в нём ничего не меняли же!
std::cout<<ptr;
//АХТУНГ!!!!!
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
16.07.2013, 21:43     Вернуть С-строку из обьекта класса #15
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Пост 10!!!!!
Хе-хе. А 4 строка стало быть не модифицирует s?
p.s. В стандарте что-то не нашел. Но вот тут четко сказано:
The pointer returned may be invalidated by further calls to other member functions that modify the object.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.07.2013, 22:04     Вернуть С-строку из обьекта класса
Еще ссылки по теме:

Вернуть двухмерный вектор с класса? C++
C++ Вернуть строку в параметрах
Вернуть указатель на строку C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
16.07.2013, 22:04     Вернуть С-строку из обьекта класса #16
Цитата Сообщение от Tulosba Посмотреть сообщение
я имел в виду функции, которые не изменяют состояние объекта. length(), capacity(), find() и т.д.
только сейчас допёр, что ты имел в виду применение этих функций к стрингу, пока используется сохранённый c_str.
Ну так да, их можно.
Yandex
Объявления
16.07.2013, 22:04     Вернуть С-строку из обьекта класса
Ответ Создать тему
Опции темы

Текущее время: 03:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru