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

std::string в char* - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Массив: используя операции + или -, из элементов массива получить в итоге значение больше 7 http://www.cyberforum.ru/cpp-beginners/thread602685.html
С клавиатуры задается массив чисел. Нужно, используя операции + или - получить в итоге значение больше 7. Причем предложить все возможные варианты. Что-то вроде того? #include <iostream> ...
C++ Рекурсивная функция, число и показатель степени Ребят помогите пожалуйста не могу понять как решить данную задачу: Напишите программу, которая запрашивает число и показатель степени.Напишите рекурсивную функцию, которая возводит число в степень... http://www.cyberforum.ru/cpp-beginners/thread602675.html
Нахождение минимального кол-ва слов C++
Подскажите как мне найти строку, содержащую наименьшее количество слов, и вывести её на экран монитора? в программе register char *mas = new char; register char *m = mas; register char *uk; ...
C++ Ошибка "error C2011: переопределение типа"
struct Tunit { public : int team; int team_agricultural; POINT location; POINT moveLocation; float max_helf; float current_helf; int ID_cel;
C++ Вычислить сумму элементов матрицы http://www.cyberforum.ru/cpp-beginners/thread602614.html
Как вычислить сумму положительных элементов матрицы А размером N*N, расположенных над главной диагональю?
C++ Перевести с паскаля на с++ Люди) есть проблемко с курсовой задачкой, вроде как нашел нужную, да вот только она не на том языке что мне нужен =( задачка большая, звучит так: Создать список, содержащий сведения об отправлении... подробнее

Показать сообщение отдельно
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
16.06.2012, 15:00  [ТС]
Цитата Сообщение от Toshkarik Посмотреть сообщение
Она не может возвращать ссылку на оригинал, сама строка может хранится в контейнере std::string блоками в разных участках памяти, что и писали выше.
И что?
Цитата Сообщение от Toshkarik Посмотреть сообщение
std::string::c_str() лишь генерирует Си строку, указателем на которую можно безопасно пользоваться до любого изменения строки.
си строка есть строка символов, хранимых подряд в одном месте и с терминальным нолём. Возвращается не список, не дерево, не массив и не иной контейнер си строк а сама строка. Значит после std::string::c_str() такая строка существует. Почему бы теперь ни назначить внутренний указатель на строку уже на неё? Раз уж память выделена. То есть сначала меняем размещение оригинал и ставим терминальный ноль, а потом уже возвращаем указатель. При этом длина строки продолжает храниться в готовом виде. С другой стороны, можно вернуть копию и при этом указатель на неё запомнить внутри, а при повторном std::string::c_str() верунть второй раз ту же копию. Я свой кривостринг сделала сначала с возвратом оригинала, причём, данные всегда хранились в виде комбинации динамической си строки (с терминальным нолём), её длины в отдельном поле.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class TSting
{
 protected:
  char *data; // нуль-терминальная строка
  unsigned long int count; // длина строки
 public:
  TString ();
  TString (TString &s);
  TString (char *s);
 ~TString ();
 TString operator +=(TString &s);
 TString operator +=(char *s);
 TString operator +=(char c);
 TString operator +(TString &s);
 TString operator +(char *s);
 TString operator +(char c);
 TString operator =(TString &s);
 TString operator =(char *s);
 TString operator =(char c);
 char &operator [] (unsigned long int number); // номирация с ноля
 unsigned long int Length();
 operator  unsigned long int (); //Тоже возвращает длину строки
};
при запросе длины строки, она возвращается из поля count. При любой операции строки, которая может изменить её длину, count обновляется. Если к строке TString добавляется си строка, то сначала в цикле считается её длина, потом выделяется память, потом count увеличивается на длину слагаемого оператором += и только потом происходит копирование из обеих строк, сначала из старого TString. Если строка TString созданётся на основе си строки, или ей присваивается си строка, то сначала счёт символов в цикле, потом выделение памяти, потом копирование, потом присваивание длины. В остальных случаях сразу выделение памяти, потом копирование, потом += для увеличения count. Потом переписал на возврат копии, за удаление которой отвечала вызывающая функция. Каждый раз возвращалась новая копия, но данные всё равно хранились подряд и с теримнальным нолём на конце. И покажи ка цитату из стандарта, гарантирующую, что символы стринга хранятся в разрозненных кусках. Если нет гарантии обратного, то это ещё ничего не значит.
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru