Ansistring общие вопросы


Строки как переменные типа AnsiString

Русификация консольных приложений.

Е) Примеры работы со строками — массивами char.

Задача 2. Удалить символ «с» из строки s каждый раз, когда он встречается.

Задача 3. Если строка начинается со слова «song» (неважно, в каком регистре), добавить в начало и конец ее восклицательные знаки.

if (!strnicmp(s, «song», 4)) <

Если s было равно «Song 1», то оно станет равно «!Song 1!».

Другой вариант решения этой же задачи:

if (!strnicmp(s, «song», 4)) <

Задача 4. Из строки выделить и вывести подстроку, содержащую запись вещественного числа без знака с фиксированной точкой. Если таких подстрок несколько, вывести их все.

//(Вначале была проверка j>=0, т.к. иначе s[j] недопустимо)

// Выделение дробной части вещественного числа

char s[]=»Минск !», s1[256];

printf(«\n Vvedi string:»);

CharToOem(«\n Значение а = %d r = %f\n», buf);

printf(buf, a, r); //Вместо строковой вонстанты —

а) Основные понятия.

В оконных компонентах и функциях C++ Builder’а основным строковым типом является тип AnsiString, который обозначается также просто как String (первая буква большая! Тип string (с малой буквы) — это уже другой похожий тип, из библиотеки STL).

Работа с типом String чаще всего удобнее, чем с массивом char. Однако скорость выполнения операций при работе с большими объемами данных может быть ниже.

Тип Stringспособен хранить строки неограниченного размера. Переменная типа String сама по себе является лишь указателем и занимает 4 байта, а текст строки хранится отдельно от нее, память для него выделяется динамически.

Отдельные символы, входящие в строку типа String, имеют тип char. К ним можно обращаться так же, как к элементам массива, но нумерация начинается с единицы:

Текст в переменной типа String не обязательно заканчивается нуль-терминатором. Более того, попытка обращения к несуществующему символу строки (например, в вышеприведенном образце V[0], или V[8]) может вызвать ошибку (в то время как выход за границы массива не проверяется). Поэтому изменять длину строки (например, добавить в нее новый символ) нужно не присваиванием значений отдельным символам, а другими способами, описанными ниже.

В оконном приложении ввод-вывод строк типа String возможен через большинство компонентов (с использованием их соответствующих свойств, например для Edit — свойства Text) без специального преобразования типов:

б) Действия над типом String.

Основными операциями с типом String являются:

1) Присваивание: S1=S2;

2) Сравнение: S1==S2, S1 Lines->Add(S1+» «+S2);

Допустимы и операции присваивания вида S1+=S2.

Заметим, что переменной типа String можно присваивать и значение большинства других типов: символьных (char, массив char), числовых (int, double и т.д.), при этом они автоматически преобразуются к типу String. Аналогично, если в бинарной операции первый операнд имеет тип String, второй также преобразуется к типу String:

S2=23.5; // Равносильно S2=FloatToStr(23.5);

Многие другие операции над строками осуществляются с помощью методов типа String. Метод — это тип функций, вызываемых особым образом: для обращения к методу надо после имени переменной типа String поставить точку, а затем имя метода и круглые скобки (в которых, при необходимости, указываются параметры метода).

Основные методы типа String (и типы их результатов, если они есть):

int Length() — длина строки (количество символов в ней);

String SubString(int i, int n) — копирует из строки подстроку, начиная с i-ой позиции, длиной n символов. Исходная строка не изменяется. (Если в исходной строке, начиная с i-ой позиции, содержится меньше n символов, метод выделяет столько символов, сколько есть).

Пример: Вывести все символы строки, кроме первого:

Insert(String S2, int i) — вставляет строку S2 в середину строки, начиная с i-ой позиции;

Delete(int i, int n) — удаляет из строки n символов, начиная с i-ой позиции. (Если в исходной строке, начиная с i-ой позиции, содержится меньше n символов, метод удаляет имеющиеся символы с i-ой позиции).

Пример: Заменить в строке S символы с 3-го по 7-ой на многоточие.

int Pos(String S2) — ищет первое вхождение подстроки S2 в данной строке. Результат — номер позиции, начиная с которой в строке содержится S2, либо 0, если S2 в ней не содержится.

char * c_str() — преобразует строку к типу «массив char» (см. ниже).

Наконец, наряду с методами, для типа String существуют также функции, например функции преобразования к заданному регистру. Они преобразуют не только латинские, но и русские буквы. Они могут применяться с целью регистро-нечувствительного сравнения:


String AnsiUpperCase (String S); ее результат получается из строки S преобразованием всех букв к верхнему регистру (большие буквы);

String AnsiLowerCase (String S); ее результат получается из строки S преобразованием всех букв к нижнему регистру (малые буквы);

S2=AnsiUpperCase(S1); // S2=»ЯЗЫК — JAVA»

в) Примеры решения задач.

Задача 5. В Edit1 заменить все пробелы на символы подчеркивания.

for (int i=1; i Text=S;

Задача 6. Заменить в строке все слова «NO» на «YES» (заменять только целые слова):

s=» «+s+» «; // иначе 1-е и последнее слова не узнает

s=s.SubString(2,s.Length()-2);//теперь удаляем пробелы

Задача 7. Заменить в строке все слова «NO» (без учета регистра) на «YES» (большими буквами); заменять только целые слова:

s=» «+s+» «; // иначе 1-е и последнее слова не узнает

s=s.SubString(2,s.Length()-2);//теперь удаляем пробелы

Задача 8. Ввести строку, состоящую из слов, разделенных пробелами. Вывести эти слова в обратном порядке, при этом самое первое по алфавиту (независимо от регистра) из них записать только большими буквами.

Не нашли то, что искали? Воспользуйтесь поиском:

Лучшие изречения: Как то на паре, один преподаватель сказал, когда лекция заканчивалась — это был конец пары: «Что-то тут концом пахнет». 8376 — | 8007 — или читать все.

188.64.174.135 © studopedia.ru Не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования. Есть нарушение авторского права? Напишите нам | Обратная связь.

Отключите adBlock!
и обновите страницу (F5)

очень нужно

AnsiString — класс динамической строки

Страницы работы

Содержание работы

AnsiString — класс динамической строки емкостью до 232-1 символов. Базой для создания этого класса послужил паскалевский тип String, который был расширен в соответствии с возможностями C++.

AnsiString – строка символов переменной размера. Вспомним как в си представляется строка :

Строка это массив символов ограниченный завершающим символом ‘\n’ (символ конца строки или символ перевода каретки).

Символьным типом данных в си является тип char (один символ), соответственно массив символов : char str[256]; — таким образом объявили массив из 256 символов, но он строкой ещё не является, т.к. не содержит в нутрии себя ничего и не ограничен завершающим символом.

Запись данных в такую «строку» можно осуществить следующим образом — посимвольно занося элементы в массив : str[0]=’a’; str[1] = ‘b’; str[2] = ‘c’; ….. str[33] = ‘\n’;

Ту же операцию выполняет функция strcpy(str,”abcdefg”); — она посимвольно скопирует содержимое строки в str (в данном случае в качестве копируемой строки выступает строковая константа ”abcdefg” ), функция скопирует содержимое и в конце строки назначения поставит завершающий символ ‘\n’.

Кроме того есть ещё ряд функций работающий со строками char : strcat, strcmp …

При работе со строками char всегда необходимо помнить тот факт, что работам с массивом символов, а при работе с AnsiString этого помнить не нужно, рассмотрим пример :

в данном случае операция str1 = “stroka1”; будет ошибочна, т.к. здесь идёт присваивание массиву константы (необходимо посимвольное копирование, но операция “=“ посимвольного копирования не производит ), вместо этого для строк char придётся вызывать функцию strcpy(str1, “stroka1”). В случае со строкой AnsiString всё проще, т.к. операция присваивания производит именно посимвольную запись внутрь строки AnsiString. Сделаем вывод в строки AnsiString удобней записывать содержимое, но на этом достоинства AnsiString не заканчиваются, рассмотрим их :

2) Склейка строк :

AnsiString str1, str2, str3;

str3 = str1 + str2;

в результате в строке str3 будет содержатся : “123456abcdefg”;

Также для склейка строк может быть проведена с помощью оператора +=

тогда в str3 будет содержатся “123456abcdefg123456”;

3) Использование встроенных в класс AnsiString функций:

AnsiString str1 = “11”;

int a = str1.ToInt(); //Преобразование строки в целое число

double b = str1.ToDouble(); //Преобразование строки в число с плавающей точкой

В данном примере обратите внимание, что в качестве разделителя в строке используется запятая.


int len = str1.Length(); //вычисление длины строки AnsiString

4) Форматированная запись в строку :

double b = 3.1234;

После выполнения данной функции в str1 ,будет содержатся 3.12, формат тот же, что и у функции printf из стандартной библиотеки ввода-вывода

5) Удаление подстроки :

AnsiString buf = “123456abcdefg”;

buf.Delete(1,6) ; //удалить из строки buf 6 символов начиная с первого

В результате в строке останется только “abcdefg”; Внимание в строках AnsiString нумерация символов начинается с 1 а не с 0 как это принято в си (это связано с тем, что строки AnsiString скопированы с Delphi, синтаксис которого основан на языке Pascal там нумерация идёт с 1).

6) Поиск подстроки :

int a = str1.Pos(«ab»);

Функция Pos вернёт номер символа вхождения подстроки в исходной строке, если подстрока не найдена, то функция вернёт 0 (тут тоже важно помнить, что 0 – это не нулевой, то есть начальный символ, если подстрока начинается с 1-го символа то функция вернёт 1!). Кроме того например мы ищем подстроку «11» в строке «11aa11dddd» видим, что подстрока встречается 2 раза, в данном случае функция Pos вернёт номер вхождения 1-ой подстроки.

Рассмотрим пример : сколько раз встретится подстрока в исходной строке :

AnsiString str1, str2, buf;

int counter = 0; //счётчик вхождений подстроки

buf = str1; //копируем строку в промежуточную

counter++; //нарасчиваем счётчик

buf.Delete(buf.Pos(str2),str2.Length()); //удаляем найденное вхождение

Илон Маск рекомендует:  Переходим к языку с

break; //если вхождений подстроки больше не встретилось завершаем цикл

7) Вставка подстроки

вставим подстроку «@@@@@» в str1 с 6 символа

8) Преобразование в char

Во многих случаях требуется преобразовать строку AnsiString в char, например для использования данной строки в стандартных функциях ввода-вывода, :

тот же пример с использованием printf :

9) Выделение подстроки (начиная с нужного символа, определенной длины) :

AnsiString str2 = str1.SubString(2,3);

В результате в str2 будет «234»

10) Заполнение строки символами :

Интересную возможность предоставляет функция StringOfChar, она заполняет строку указанным символом, требуемое количество раз, например :

В str1 получим : “ffffffffff”

Кроме того есть ещё функция которая возвращает последний символ в строке (который стоит перед \n)

char *c = str1.AnsiLastChar();

11) Операторы сравнения.

Сроки типа char мы сравнивали при помощи функции strcmp, для сравнения строк AnsiString используются операторы ==, >, >=

“==” проверяет строки на посимвольное равенство и равенство по длине

“>” сравнивает строки посимвольно ориентируясь на положение символа в таблице ASCII

AnsiString buf1 = «acc»;

AnsiString buf2 = «bb»;

if(buf1 > buf2) puts(«da»);

получаем ответ «net» т.к. первый символ строки buf1 ‘a’ стоит в кодовой таблице (по алфавиту) раньше, чем 1-ый символ строки buf2

AnsiString buf1 = «ccc»;


AnsiString buf2 = «bb»;

if(buf1 > buf2) puts(«da»);

в данном случае получаем ответ ‘da’ т.к. первый символ buf1 ‘c’ по алфавиту стоит дальше, чем ‘b’.

12) Доступ к символам строки по индексу : В случае AnsiString мы используем тот же оператор доступа по индексу [], что и со строками char, но при этом обязательно нужно помнить, что нумерация в AnsiString идет с 1!

Рассмотрим пример – в строку buf2 нужно записать все символы из строки buf1 с чётными номерами :

AnsiString buf1 = «123456»;

  • АлтГТУ 419
  • АлтГУ 113
  • АмПГУ 296
  • АГТУ 266
  • БИТТУ 794
  • БГТУ «Военмех» 1191
  • БГМУ 172
  • БГТУ 602
  • БГУ 153
  • БГУИР 391
  • БелГУТ 4908
  • БГЭУ 962
  • БНТУ 1070
  • БТЭУ ПК 689
  • БрГУ 179
  • ВНТУ 119
  • ВГУЭС 426
  • ВлГУ 645
  • ВМедА 611
  • ВолгГТУ 235
  • ВНУ им. Даля 166
  • ВЗФЭИ 245
  • ВятГСХА 101
  • ВятГГУ 139
  • ВятГУ 559
  • ГГДСК 171
  • ГомГМК 501
  • ГГМУ 1967
  • ГГТУ им. Сухого 4467
  • ГГУ им. Скорины 1590
  • ГМА им. Макарова 300
  • ДГПУ 159
  • ДальГАУ 279

  • ДВГГУ 134
  • ДВГМУ 409
  • ДВГТУ 936
  • ДВГУПС 305
  • ДВФУ 949
  • ДонГТУ 497
  • ДИТМ МНТУ 109
  • ИвГМА 488
  • ИГХТУ 130
  • ИжГТУ 143
  • КемГППК 171
  • КемГУ 507
  • КГМТУ 269
  • КировАТ 147
  • КГКСЭП 407
  • КГТА им. Дегтярева 174
  • КнАГТУ 2909
  • КрасГАУ 370
  • КрасГМУ 630
  • КГПУ им. Астафьева 133
  • КГТУ (СФУ) 567
  • КГТЭИ (СФУ) 112
  • КПК №2 177
  • КубГТУ 139
  • КубГУ 107
  • КузГПА 182
  • КузГТУ 789
  • МГТУ им. Носова 367
  • МГЭУ им. Сахарова 232
  • МГЭК 249
  • МГПУ 165
  • МАИ 144
  • МАДИ 151
  • МГИУ 1179
  • МГОУ 121
  • МГСУ 330
  • МГУ 273
  • МГУКИ 101
  • МГУПИ 225
  • МГУПС (МИИТ) 636
  • МГУТУ 122

  • МТУСИ 179
  • ХАИ 656
  • ТПУ 454
  • НИУ МЭИ 641
  • НМСУ «Горный» 1701
  • ХПИ 1534
  • НТУУ «КПИ» 212
  • НУК им. Макарова 542
  • НВ 777
  • НГАВТ 362
  • НГАУ 411
  • НГАСУ 817
  • НГМУ 665
  • НГПУ 214
  • НГТУ 4610
  • НГУ 1992
  • НГУЭУ 499
  • НИИ 201
  • ОмГТУ 301
  • ОмГУПС 230
  • СПбПК №4 115
  • ПГУПС 2489
  • ПГПУ им. Короленко 296
  • ПНТУ им. Кондратюка 119
  • РАНХиГС 186
  • РОАТ МИИТ 608
  • РТА 243
  • РГГМУ 118
  • РГПУ им. Герцена 124
  • РГППУ 142
  • РГСУ 162
  • «МАТИ» — РГТУ 121
  • РГУНиГ 260
  • РЭУ им. Плеханова 122
  • РГАТУ им. Соловьёва 219
  • РязГМУ 125
  • РГРТУ 666
  • СамГТУ 130
  • СПбГАСУ 318
  • ИНЖЭКОН 328

  • СПбГИПСР 136
  • СПбГЛТУ им. Кирова 227
  • СПбГМТУ 143
  • СПбГПМУ 147
  • СПбГПУ 1598
  • СПбГТИ (ТУ) 292
  • СПбГТУРП 235
  • СПбГУ 582
  • ГУАП 524
  • СПбГУНиПТ 291
  • СПбГУПТД 438
  • СПбГУСЭ 226
  • СПбГУТ 193
  • СПГУТД 151
  • СПбГУЭФ 145
  • СПбГЭТУ «ЛЭТИ» 380
  • ПИМаш 247
  • НИУ ИТМО 531
  • СГТУ им. Гагарина 114
  • СахГУ 278
  • СЗТУ 484
  • СибАГС 249
  • СибГАУ 462
  • СибГИУ 1655
  • СибГТУ 946
  • СГУПС 1513
  • СибГУТИ 2083
  • СибУПК 377
  • СФУ 2423
  • СНАУ 567
  • СумГУ 768
  • ТРТУ 149
  • ТОГУ 551
  • ТГЭУ 325
  • ТГУ (Томск) 276
  • ТГПУ 181
  • ТулГУ 553
  • УкрГАЖТ 234
  • УлГТУ 536
  • УИПКПРО 123

  • УрГПУ 195
  • УГТУ-УПИ 758
  • УГНТУ 570
  • УГТУ 134
  • ХГАЭП 138
  • ХГАФК 110
  • ХНАГХ 407
  • ХНУВД 512
  • ХНУ им. Каразина 305
  • ХНУРЭ 324
  • ХНЭУ 495
  • ЦПУ 157
  • ЧитГУ 220
  • ЮУрГУ 306

Полный список ВУЗов

Чтобы распечатать файл, скачайте его (в формате Word).

Методы обработки строк типа AnsiString

Читайте также:

  1. Clr (str) — очистка строки.
  2. I Общие методы исследования политических объектов.
  3. I. Методы перво-христианской экзегезы.
  4. II. МЕТОДЫ (МЕТОДИКИ) ПАТОПСИХОЛОГИЧЕСКОГО ИССЛЕДОВАНИЯ МЕТОДИКИ ДЛЯ ИССЛЕДОВАНИЯ ВНИМАНИЯ И СЕНСОМОТОРНЫХ РЕАКЦИЙ
  5. III) Методы управления
  6. IV. Лабораторные (иммунологические, биохимиче­ские) методы 1 страница
  7. IV. Лабораторные (иммунологические, биохимиче­ские) методы 2 страница
  8. IІІ. Строки прийому заяв і документів, вступних екзаменів, конкурсного відбору та зарахування на навчання
  9. V. Карточка обработки хронорядов показателей
  10. V. Карточка обработки хронорядов показателей
  11. V. Карточка обработки хронорядов показателей 1 страница
  12. V. Карточка обработки хронорядов показателей 2 страница

Преобразования дат и времени

Функции объявлены в файлах SysUtils.hpp, time.h.

System::TDateTime Date(void) ‑ возвращает текущую дату.

System::AnsiString DateTimeToStr(System::TDateTime DateTime) — преоб­ра­зует DateTimeв строку.

Void DateTimeToString(System::AnsiString &Result, const System:: Ansi­String Format, System::TDateTime Date Time) ‑преобразует DateTimeв строку Result по формату Format (п.1.7.3).

System::AnsiString DateToStr(System::TDateTime Date) ‑ преобразует дату Dateв строку.

void DateTimeToSystemTime(System::TDateTime DateTime, _SYSTEM­TI­ME &SystemTime) ‑ преобразует DateTimeв формат TSystemTime, исполь­зу­емый в API Windows.

int DayOfWeek(System::TDateTime Date) ‑ извлекает из даты Date день недели (от 1 до 7, 1 — воскресенье).

void DecodeTime(System::TdateTime Time, Word &Hour, Word &Min, Word &Sec, Word &Msec) разбивает Time на часы Hour, минуты Min, секунды Sec, миллисекунды Msec.

TDateTime EncodeDate(Word Year, Word Month, Word Day) ‑ преобразует год Year,месяц Monthи деньDayвTdateTime.

TDateTime EncodeDate(Word Hour, Word Min, Word Sec, Word MSec) ‑пре­образует часы Hour,минуты Min, секунды Sec, миллисекунды MSecвTDateTime.

System::AnsiString FormatDateTime(const System:: AnsiString Format,System::TDateTime DateTime) ‑ преобразует DateTime в строку по формату Format.

System::TDateTime IncMonth(const System:: TdateTime Date, int NumberOfMonths) ‑ возвращает датуDate,измененную наNumberOfMonthsмесяцев.

bool IsLeapYear(Word Year) ‑ возвращает true,если годYearвисокосный.

System::TDateTime Now(void) ‑ возвращает текущую дату и время.

System::TDateTime StrToDate(const System::AnsiString S) ‑ преобразует строку Sв датуTDateTime.

System::TDdateTime StrToDateTime(const System::AnsiString S) — пре­об­ра­зу­ет строку Sв дату и времяTDateTime.

System::TDdateTime StrToTime(const System::AnsiString S) ‑ преобразует строку Sво времяTDateTime.

System::TDateTime SystemTimeToDateTime(const _SYSTEMTIME &SystemTime) ‑ преобразует формат TSystemTime, используемый в API Windows, в TdateTime.

System::TDateTime(void) ‑ возвращает текущее время.


System::AnsiString TimeToStr(System::TDateTime Time) ‑ преобразует время в строку.

int _fastcall AnsiCompare/AnsiCompareIC(const AnsiString& rhs) const ‑ сравнивает данную строку S1 с rhsс учетом/без учета регистра и текущих установок Windows. Возвращает значение: >0 при S1>rhs,

int _fastcall AnsiPos(const AnsiString& subStr) const ‑ возвращает индекс первого вхождения subStrвS1.Если subStrне содержится вS1, возвращается 0.

void _fastcall Delete(int index, int count) ‑ удаляет из строки, начиная с позиции index, число символов, равное count.

void _fastcall Insert(const AnsiString& str, int index) ‑ вставляет в строку подстроку str,начиная с индексаindex.

bool _fastcall IsDelimiter(const AnsiString& Delimiters, int index) const — воз­вращает true, если символ с индексом index является одним из разделителей, указанных в строке Delimiters.

bool _fastcall IsEmply()const ‑ возвращает true, если строка пустая.

Int _fastcall LastDelimiter(const AnsiString& Delimiters) const ‑ возвращает последний из символов строки, входящих в строку разделителей Delimiters.

int _fastcall Length() const ‑ возвращает число символов в строке.

AnsiString _ fastcall LowerCase/UpperCase() const ‑ возвращает строку, в которой все символы приведены к нижнему/верхнему регистру.

void _fastcall SetLength(int newLength) ‑ усекает строку доnewLengthсимволов. Если исходная строка короче, то она не увеличивается.

staticAnsiString _ fastcall StringOfChar(char ch, int count) ‑ возвращает строку, в которой символ chповторенcountраз.

AnsiString _ fastcall SubString(int index, int count) const ‑ возвращает подстроку, начинающуюся с символа в позиции indexи содержащую countсимволов.

double _ fastcall ToDouble/ToInt() const ‑ преобразует строку в вещест­вен­ное/целое число.

int_fastcall ToIntDef(int default Value) const ‑ преобразует строку в целое число. Если строка не соответствует формату целого числа, возвращается значение по умолчанию default Value.

AnsiString _ fastcall Trim() const ‑ возвращает строку, соответствующую исходной, но без пробельных символов до и после значащих символов.

AnsiString _ fastcall TrimLeft/TrimRight() const ‑ возвращает строку, соот­вет­ст­ву­ющую исходной, но без начальных/заключительных пробельных символов.

wchar_t* _ fastcall WideChar(wchar_t* dest, int destSize) const ‑ преобразует строку в массив символов destтипаwchar_t.

Дата добавления: 2014-12-08 ; Просмотров: 365 ; Нарушение авторских прав? ;

Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет

Ansistring общие вопросы

Профиль
Группа: Завсегдатай
Сообщений: 1650
Регистрация: 25.12.2004

Репутация: нет
Всего: 23

Цитата
AnsiString is the C++Builder analog for the Delphi long string type.
Цитата
AnsiString — это аналог типа long string для Delphi.

У меня не получается сделать функцию наподобие этой:

Код
AnsiString *clause(char *a, int j)
<

return &buffer[0];
>

По идее она должна считывать каждое предложение, разделенное «. » в отдельный элемент массива типа AnsiString. При вызове clause(» A. B. C.», 2) должна выводить «В».

Код
//—————————————————————————
#include
#include

int n=3; /* Число предложений. */

char *a = » A! B. C?»; /* Предложения. */

AnsiString *buffer = new AnsiString [n];

for(int j=0; j

Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98

_hunter
Дата 6.6.2006, 14:24 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98


_hunter
Дата 6.6.2006, 15:15 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Завсегдатай
Сообщений: 1650
Регистрация: 25.12.2004

Репутация: нет
Всего: 23

_hunter, я спрашивал про то, как сделать функцию, которая бы возвращала ссылку на нулевой элемент массива.

Я спрашивал вот про что:

Voldemar2004
Дата 6.6.2006, 18:34 (ссылка) | (нет голосов) Загрузка .
Код
//—————————————————————————
#include
#include
#include
//—————————————————————————

void main(void)
<
char *delimiter = «. «; /* Массив разделителей. */

int n=3; /* Число предложений. */

char *a = » A! B. C?»; /* Само предложение. */

AnsiString *buffer = new AnsiString [n];

int i=0, j;
for(j=0; j

Код
cout

Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98

а я следовал правилу «один топик — один вопрос.».
так же неплохо бы следовать правилу «о минимализации тестового кода»

P.S.
после второго «пояснения» я стал понимать проблему еще меньше.

_hunter
Дата 6.6.2006, 18:57 (ссылка) | (нет голосов) Загрузка .

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

Репутация: 53
Всего: 183

Earnest
Дата 6.6.2006, 19:03 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Завсегдатай
Сообщений: 1650
Регистрация: 25.12.2004

Репутация: нет
Всего: 23

Voldemar2004
Дата 6.6.2006, 20:19 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Завсегдатай
Сообщений: 1650
Регистрация: 25.12.2004

Репутация: нет
Всего: 23

Voldemar2004
Дата 6.6.2006, 21:47 (ссылка) | (нет голосов) Загрузка .
Код
#include
#include

int arr(int *array)
<
return *array;
>

for(int i=0; i

Функция возвращает указатель на 1-ый элемент массива (по умолчанию).

А дальше по подобию:

Код
#include
#include

using namespace std; /* Пространство имен std. */

string split(char *a, int j)
<
char *delimiter = «. «; /* Массив разделителей. */

/* Число элементов в этом массиве = числу предложений. */
string *buffer = new string[ clause_count(a) ];

for(int j=0; j

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

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

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

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

Строки (AnsiString) и символьные массивы (Char[], Char*) в C++ Builder

Итак, в С++ Builder строки можно задать тремя разными способами: через специальный класс AnsiString, через массив символов char[] и через указатель на первый символ массива char*:

Задание строк String3 и String4 на самом деле эквивалентно, просто если задавать строку так, как у нас задана строка String3, то её обязательно нужно сразу инициализировать, тогда циферку в квадратные скобки за вас вставит компилятор.

Использование класса AnsiString удобно тем, что заданные с его помощью строки являются динамическими и можно особо не париться с их размером. То есть можно писать, например, так:

AnsiString String1; String1=»Hello!»; String1=»Hello world!»;

И пофигу, что во втором случае строка стала длиннее, пускай Builder сам с этим разбирается.

Для символьных массивов такой фокус не прокатит от слова совсем. Для указателя прокатит, но нужно понимать, что при этом на самом деле не меняется исходный массив, а просто изменяется значение указателя и он начинает указывать на другой существующий массив (который кто-то создал, память под него выделил). При этом старый массив, на который указывал указатель, просто потеряется. Это чревато всякими утечками памяти и тому подобными косяками.

Строки, заданные как массив символов, должны оканчиваться нулём (по-другому их называют нультерминированные). Массив Char-ов может содержать нули, но при этом строкой считается всё, что содержится от начала массива до первого встреченного нулевого символа. Например, можно задать вот такой массив:

Если в этом случае попробовать посчитать длину строки TempStr, то она окажется равной пяти, то есть количеству элементов от начала строки до нультерминатора, без учёта его самого. (Как видите, элементы массива не обязательно писать в кавычках, как символы, можно и напрямую в hex).

Более того, один массив может содержать сразу две строки. Фактически в предыдущем примере так оно и есть. Если мы напишем вот такой код:

, то в Edit1 получим текст «Hello», а в Edit2 — текст «world».

Ещё одной фишкой является то, что в AnsiString элементы считаются с единицы, а в массивах символов (да и в любых вообще массивах) — с нуля (именно поэтому символ ‘w’ в предыдущем примере шестой, а не седьмой). То есть вот такой код:

char Str[]=<'H','e','l','l','o','\0'>; AnsiString AStr=»Hello»; Edit1->Text=Str[1]; Edit2->Text=AStr[1];

выведет в поле Edit1 символ ‘e’, а в поле Edit2 символ ‘H’.

Да, кстати, как видите, элементы AnsiString тоже можно получить по индексам, совсем как элементы массива.

Поскольку AnsiString — это класс, то он имеет множество всяких полезных свойств и методов, позволяющих особо не париться с различными операциями над строками. Для массива вместо этого приходится пользоваться специальными библиотечными функциями или писать свои.

Как правило, самый частый вопрос, который возникает при работе со строками, — это преобразование типов, когда из AnsiString нужно получить массив Char или наоборот.

Итак, сначала получаем из AnsiString массив Char. Сделать это можно следующим образом:

AnsiString AStr=»Hello»; char Str1[10]=<'a','a','a','a','a','a','a','a','a','a'>; strcpy(Str1,AStr.c_str()); // копируем в существующий массив Edit1->Text=Str1;

AnsiString AStr=»Hello»; char *Str2; // создаём указатель, который пока ни к чему не привязан Str2 = new char[ Astr.Length() + 1 ]; // создаём новый массив, // привязываем к нему указатель strcpy(Str2,AStr.c_str()); // и копируем в этот массив Edit1->Text=Str2;

В первом случае нужно дополнительно проверить, чтобы массив, в который происходит копирование, был достаточного размера. Размер массива должен быть на 1 больше количества символов в строке (1 дополнительный элемент нужен для нультерминатора).

Как делать не нужно!

AnsiString AStr=»Hello»; char *Str2 = AStr.c_str();

В хэлповнике по Builder-у написано, что функция c_str() возвращает временный указатель на внутренний буфер строки в объекте AnsiString, который действителен только на время выполнения выражения, в котором он используется.

Для того, чтобы преобразовать массив char-ов в AnsiString можно использовать вот такой метод:

char Str1[]=<'H','e','l','l','o','\0'>; AnsiString AStr; AStr=AnsiString(Str1);

Преобразование выполняется до первого встреченного нультерминатора. То есть, если массив выглядел, скажем, вот так: <‘H’,’e’,’\0′,’l’,’o’,’\0′>, то после преобразования его в AnsiString, полученная строка будет выглядеть так: «He».

Некоторые полезные методы класса AnsiString

Как узнать количество символов в строке? Length
Как проверить — пустая строка или нет? IsEmpty
Как вставить подстроку внутрь строки? Insert
Как удалить часть строки? Delete
Как привести все символы строки к нижнему регистру? LowerCase
Как привести все символы строки к верхнему регистру? UpperCase
Как узнать, содержится ли подстрока в строке? Pos, AnsiPos
Как получить подстроку из строки? SubString
Как преобразовать строку в целое число? ToInt, ToIntDef
Как преобразовать целое число в строку? IntToHex
Как убрать пробелы в начале и в конце строки? Trim, TrimLeft, TrimRight

С AnsiString можно выполнять операции сложения и сравнения: + , == , != , > , ≥ ,

Добавить комментарий Отменить ответ

Для отправки комментария вам необходимо авторизоваться.

AnsiString Delphi XE7 [TEncoding]

Вопрос

Satellite 13

Satellite 13

  • Продвинутый пользователь
  • Пользователи
  • 13
  • 52 сообщения

На Windows тип AnsiString присутствует, на Android отсутствует.

Имеется код (функция):

На Windows результат отображается нормально, потому что ss:=AnsiString;

А вот на Android’e нету значения AnsiString, поэтому для теста я просто присвоил String; Отсюда пошли кракозябры, как можно получить результат в нормальной читаемой кодировке?

Почитав немного, наткнулся на TEncoding, но не разобрался.

BestProg

Работа со строками. Класс string . Конструкторы класса. Функции assign() , append() , insert() , replace() , erase() , find() , rfind() , compare() , c_str() . Примеры

Содержание

1. Какое назначение класса string в программах на C++?

Класс string предназначен для работы со строками типа char* , которые представляют собой строку с завершающим нулем. Класс string был введенн как альтернативный вариант для работы со строками типа char* . Строки, которые завершаются символом ‘\0’ еще называются C-строками. Поскольку, string есть классом, то можно объявлять объекты этого класса.

2. Какие модули (библиотеки) нужно подключить, чтобы использовать возможности класса string в MS Visual Studio C++?

Чтобы использовать возможности класса string в MS Visual Studio (C++), нужно подключить библиотеку и пространство имен std .

3. Каким образом осуществляется объявление переменной типа string ? Примеры

Объявление переменной типа string осуществляется точно так же как и обычной переменной. Возможный вариант объявления с одновременной инициализацией.

4. Какие преимущества и недостатки дает использование класса string в сравнении с типом char* ?

Создание нового типа string было обусловлено недостатками работы с строками символов, который демонстрировал тип char* . В сравнении с типом char* тип string имеет следующие основные преимущества:

  • возможность обработки строк стандартными операторами C++ ( = , + , = = , <> и т.п.). Как известно, при использовании типа char* даже наиболее простые операции со строками выглядели сложно и требовали написания чрезмерного программного кода;
  • обеспечение лучшей надежности (безопасности) программного кода. Например, при копировании строк, тип string обеспечивает соответствующие действия, которые могут возникнуть в случае, если строка-источник имеет больший размер чем строка-приемник;
  • обеспечение строки, как самостоятельного типа данных. Объявление типа string как строки есть единым для всех переменных в программе, которая обеспечивает непротиворечивость данных.

Основным недостатком типа string в сравнении с типом char* , есть замедленная скорость обработки данных. Это связано с тем, что тип string – это, фактически, контейнерный класс. А работа с классом требует дополнительной реализации программного кода, который, в свою очередь занимает лишнее время.

5. Какие операторы можно использовать с объектами класса string ?

Класс string есть удобен тем, что позволяет удобно манипулировать строками, используя стандартные (перегруженные) операторы.

С объектами класса string можно использовать нижеследующие операторы

  • = – присваивание
  • + – конкатенация (объединение строк)
  • += – присваивание с конкатенацией
  • == – равенство
  • != – неравенство
  • – меньше
  • – меньше или равно
  • > – больше
  • >= – больше или равно
  • [ ] – индексация

Пример, который демонстрирует использование вышеприведенных операторов

6. Содержит ли класс string конструкторы?

Как и любой класс, класс string имеет ряд конструкторов. Основные из них следующие:

7. Примеры инициализации с помощью конструкторов

Ниже приведены примеры инициализации переменных типа string

8. Присваивание строк. Функция assign() . Примеры

Чтобы присвоить одну строку другой, можно применить один из двух методов:

  • использовать оператор присваивания ‘=’ ;
  • использовать функцию assign() из класса string .

Функция assign() имеет несколько перегруженных реализаций.

Первый вариант – это вызов функции без параметров

В этом случае происходит простое присваивание одной строки другой.

Второй вариант позволяет копировать заданное количество символов из строки:

  • s – объект, из которого берется исходная строка;
  • st – индекс (позиция) в строке, из которой начинается копирование num символов;
  • num – количество символов, которые нужно скопировать из позиции st ;
  • size_type – порядковый тип данных.

Третий вариант функции assign() копирует в вызывающий объект первые num символов строки s :

  • s – строка, которая завершается символом ‘\0’ ;
  • num – количество символов, которые копируются в вызывающий объект. Копируются первые num символов из строки s .

Ниже приведен пример с разными реализациями функции assign() .

Пример.

9. Объединение строк. Функция append() . Пример

Для объединения строк используется функция append() . Для добавления строк также можно использовать операцию ‘+’ , например:

Однако, функция append() хорошо подходит, если нужно добавлять часть строки.

Функция имеет следующие варианты реализации:

В первом варианте реализации функция получает ссылку на строчный объект s , который добавляется к вызывающему объекту. Во втором варианте реализации функция получает указатель на строку типа const char * , которая завершается символом ‘\0’ .

Пример. Демонстрация работы функции append() .

10. Вставка символов в строке. Функция insert() . Пример

Чтобы вставить одну строку в заданную позицию другой строки нужно использовать функцию insert() , которая имеет несколько вариантов реализации.

Первый вариант функции позволяет вставить полностью всю строку s в заданную позицию start вызывающей строки (вызывающего объекта):

Второй вариант функции позволяет вставить часть (параметры insStart , num ) строки s в заданную позицию start вызывающей строки:

В вышеприведенных функциях:

  • s – строка, которая вставляется в вызывающую строку;
  • start – позиция в вызывающей строке, из которой осуществляется вставка строки s ;
  • insStart – позиция в строке s , из которой происходит вставка;
  • num – количество символов в строке s , которые вставляются с позиции insStart .
11. Замена символов в строке. Функция replace() . Пример

Функция replace() выполняет замену символов в вызывающей строке. Функция имеет следующие варианты реализации:

В первом варианте реализации вызывающая строка заменяется строкой s . Есть возможность задать позицию ( start ) и количество символов ( num ) в вызывающей строке, которые нужно заменить строкой s .

Второй вариант функции replace() отличается от первого тем, что позволяет заменять вызывающую строку только частью строки s . В этом случае задаются два дополнительных параметра: позиция replStart и количество символов в строке s , которые образуют подстроку, которая заменяет вызывающую строку.

Пример. Демонстрация работы функции replace() .

12. Удаление заданного количества символов из строки. Функция erase() . Пример

Для удаления символов из вызывающей строки используется функция erase() :

  • index – индекс (позиция), начиная из которой нужно удалить символы в вызывающей строке;
  • num – количество символов, которые удаляются.

Пример.

13. Поиск символа в строке. Функции find() и rfind() . Примеры

В классе string поиск строки в подстроке можно делать двумя способами, которые отличаются направлением поиска:

  • путем просмотра строки от начала до конца с помощью функции find() ;
  • путем просмотра строки от конца к началу функцией rfind() .

Прототип функции find() имеет вид:

  • s – подстрока, которая ищется в строке, что вызывает данную функцию. Функция осуществляет поиск первого вхождения строки s . Если подстрока s найдена в строке, что вызвала данную функцию, тогда возвращается позиция первого вхождения. В противном случае возвращается -1;
  • start – позиция, из которой осуществляется поиск.

Прототип функции rfind() имеет вид:

  • s – подстрока, которая ищется в вызывающей строке. Поиск подстроки в строке осуществляется от конца к началу. Если подстрока s найдена в вызывающей строке, то функция возвращает позицию первого вхождения. В противном случае функция возвращает -1;
  • npos – позиция последнего символа вызывающей строки;
  • start – позиция, из которой осуществляется поиск.

Пример 1. Фрагмент кода, который демонстрирует результат работы функции find()

Пример 2. Демонстрация работы функции rfind() .

14. Сравнение частей строк. Функция compare() . Пример

Поскольку тип string есть классом, то, чтобы сравнить две строки между собой можно использовать операцию ‘= =’ . Если две строки одинаковы, то результат сравнения будет true . В противном случае, результат сравнения будет false .

Но если нужно сравнить часть одной строки с другой, то для этого предусмотрена функция compare() .

Прототип функции compare() :

  • s – строка, которая сравнивается с вызывающей строкой;
  • start – позиция (индекс) в строке s , из которой начинается просмотр символов строки для сравнения;
  • num – количество символов в строке s , которые сравниваются с вызывающей строкой.

Функция работает следующим образом. Если вызывающая строка меньше строки s , то функция возвращает -1 (отрицательное значение). Если вызывающая строка больше строки s , функция возвращает 1 (положительное значение). Если две строки равны, функция возвращает 0.

Пример. Демонстрация работы функции compare() :

15. Получение строки с символом конца строки ‘\0’ ( char * ). Функция c_str() . Пример

Чтобы получить строку, которая заканчивается символом ‘\0’ используется функция c_str() .

Функция объявлена с модификатором const . Это означает, что функция не может изменять вызывающий объект (строку).

Пример 1. Преобразование типа string в const char * .

Пример 2.

Ниже продемонстрирован перевод строки из string в тип System::String для отображения его в элементе управления типа Label для приложений типа Windows Forms Application .

16. Как определить длину строки типа string ? Функция length()

Для определения количества символов в строке используется функция length() без параметров.

Ansistring общие вопросы

Я думаю, что в любой программе подобные штуки нужны. Вообще на строки C++ Builder богат — тут и собственные массивы, и свистнутый у Delphi AnsiString, и UNICODE WideString, и даже из STL есть класс. Так что есть из чего выбрать. Но я перечислю по порядку.

AnsiString

Также называемый просто String (для удобства записи определен через typedef). Основной строковый класс VCL. Используется почти везде, где нужно представить текст. На мой взгляд, самый удобный класс — много хороших методов, хорошая совместимость, объектный конструктор переваривает типы от char* до double. Как я сказал, методов много, даже чересчур. Перечислю главные:

  • с_str() — возвращает указатель на массив NULL-terminated string, содержащий ту же информацию, что и исходная строка. Используется для WinAPI обращений.
  • data() — то же самое, что и предыдущий, только при пустой строке возвращает не «», а NULL. Иногда это бывает удобно.
  • CurrToStr(), CurrToStrF() — перевод типа TCurrency в строку.
  • FloatToStrF() — форматированный перевод из плавающего числа в строку.
  • IntToHex() — перевод шестнадцатеричного числа. Второй параметр — минимальное число цифр.
  • ToInt(), ToDouble(), ToIntDef() — возвращает соответственно int, double, default int.
  • Delete(), SubString() — соответственно удаление символов и копирование подстроки.
  • Pos() — позиция строки-аргумента, начиная с 1.
  • Length() — длина строки.
  • printf(), sprintf() — форматирование строки по таким же спецификаторам, как в предыдущем шаге. Первая заменяет значение строки форматированным, вторая его присоединяет.
  • operator[] — один из операторных методов. Возвращает соответствующий char, как в массиве, начиная с 1.

Еще эти строки сравниваются по стандарту ANSI через операторы сравнения.

Старые добрые символьные массивы, состоящие из символов и ограниченные последним значением, равным NULL. Поэтому их еще называют NULL-terminated string. Писать долго, зато очень звучно ;). Используются в основном при обращении к WinAPI функциям. При желании более подробную информацию можно посмотреть в Help‘е, а я приведу функции. Первый аргумент здесь везде основная строка:

  • strlen() — длина строки.
  • sprintf() — аналогичное printf() форматирование.
  • strcpy() — копирование одной строки в другую.
  • strstr() — аналогично Pos().
  • strcmp(), strcmpi() — сравнение двух строк. Во втором случае без учета регистра.

WideString

Этот класс также взят из Delphi. Основным его отличием от AnsiString является хранение массива расширенных символов, называемых wide characters, тип wchar_t*. Поэтому он в основном используется в COM приложениях или при обращении к OLE интегрированным объектам. Приводить его методы я не буду, поскольку они очень сильно похожи на соответствующие в AnsiString. Наиболее оригинальным является метод c_bstr(), возвращающий, по аналогии с c_str(), указатель на массив из wchar_t*. Он используется без аргументов.

Надо отметить, что существуют еще некоторые строчные классы C++, которые я не рассмотрел. Например: string, basic_string, SmallString. Я все же скажу насчет первых двух. Класс string я считаю несколько устаревшим на фоне AnsiString. Класс basic_string является классом STL.

Не присваивается значение переменной типа AnsiString

Не могу понять в чем дело. Просветите пожалуйста. Буду очень благодарен.

Дополнительно

1 ответ 1

т.е. кавычки не нужны

Всё ещё ищете ответ? Посмотрите другие вопросы с метками c++ строки или задайте свой вопрос.

Похожие

Подписаться на ленту

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

дизайн сайта / логотип © 2020 Stack Exchange Inc; пользовательское содержимое попадает под действие лицензии cc by-sa 4.0 с указанием ссылки на источник. rev 2020.11.11.35402

тип Ansistring

Такой и должен быть тип:
AnsiString

Если же надо в указатель на char, то пиши так:

и не забудь потом освободить память

Порядка 2^31 символов, т.е. до объёмом до 2Гб.

ЗЫ: Так сложно заглянуть в help?

Цитата
Если же надо в указатель на char, то пиши так:
Цитата
Лучше не надо — использовать в С++ malloc и free — дурной тон.
Цитата
Такой и должен быть тип:

Если же надо в указатель на char, то пиши так:

и не забудь потом освободить память

А почему просто нельзя ?

Цитата
Usually, the value returned by c_str points to the internal character array referenced by the data property. This pointer is valid until the string is next modified (for example when the SetLength method is called or the AnsiString goes out of scope). However, if the internal array is NULL, c_str returns a pointer to a string literal.

Вот. Т.е. чтобы гарантировать валидность указателя. И иметь возможность делать со строкой всё, что захочу.

Илон Маск рекомендует:  Что такое код ncurses_use_env
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL