425.00K
Категория: ПрограммированиеПрограммирование

Строковые типы в VC++

1.

Строковые типы в VC++

2.

Расширенные символы Unicode
• По умолчанию сохраняемые файлы записываются
не в стандартной кодировке Windows, а в
кодировке Unicode(расширенные символы).
Расширенный символ – это двухбайтный код
символа для кодирования символов в различных
языках.
Размера длины кода символа хватает, чтобы
закодировать символы на любом языке, включая
разные технические символы
(в отличие от однобайтного кода таблицы ASCII, который не
обеспечивал одновременного кодирования символов всех языков).

3.

Типы данных
• Кодирование символами в системе Unicode
относится к типу wchar_t.
• Строка символов представляет собой массив
wchar_t[], а указателем на такую строку (или
начало массива) является указатель wchar_t*.

4.

ASCII в Unicode
• Любой ASCII-символ можно представить в
расширенной кодировке, добавив к нему слева
символ L.
• Например, L’\0’– это признак конца строки в
Unicode.
• Таким же образом можно представить любую
ASCII-строку в Unicode, предваряя ее символом L
(например, L”Привет”).

5.

Функции для работы со строками
• Функции для работы со строками типа wchar_t
по своим действиям точно такие же, как и
соответствующие им функции для типа char,
• Но их функциональность скорректирована с
учетом, что символ в строке является
расширенным и кодируется двумя байтами.
• К именам этих функций добавлен символ «w».
Например, _wtoi, _wtof, wcscpy, wcscmp и пр.

6.

String
• Это класс из пространства System,
предназначенный для работы со строковыми
данными.
• Используется при объявлении строки с
указателем ^, например, String ^s;.
• Знак ^ объявляет указатель на объект в участке
памяти, который выделяется под экземпляры
объектов и автоматически освобождается, когда
этот объект перестает использоваться.
• Это указатель на целый объект, а не на какойлибо его член.

7.

Создание String ^S
• Объект создается с помощью утилиты gcnew и
конструктора объекта.
• Указатель ^ выдает ссылку на объект в выделенной
памяти всегда, даже когда объект переместился
в этом участке.
• Указатели обычного типа в подобных случаях этого
делать не могут.
• В остальном применение указателя ^ к элементу
объекта такое же, как и других указателей:
– надо писать оператор «->» после имени объекта, чтобы получить
доступ к его члену (например, s->Copy() дает доступ к члену
объекта String – методу копирования данных).

8.

Применение типа String
• Объявление переменной: String ^S;
• Этой переменной можно присваивать значения
такого же типа, что были уже где-то созданы и,
следовательно, расположены в выделенной для
них памяти: S=a;
– Здесь a – это переменная типа String, имеющая некоторое
значение.
– Указатель ^ указывает на объект a в выделенной для него
памяти.
– Если по каким-то причинам объект a переместится в памяти
на другое место, то указатель изменит свое значение на
новое, которое все равно станет указывать на объект с
именем a.

9.

Применение типа String
• Переменной S типа String можно присваивать
значение и с помощью конструктора,
использующего утилиту gcnew
– она выделяет память под объект, на который
воздействует конструктор, когда
присваиваемое значение имеет тип, отличный
от типа String.

10.

Конструктор для String
• String (const wchar_t *value);
• String (const wchar_t *value,
int StartIndex, int Length);
Здесь происходит выделение из строки Unicode
подстроки длины Length с началом на символе
StartIndex.
• String (const char *value);
Здесь обрабатывается обычная строка с
нулевым признаком конца и выдается значение
типа String.

11.

Конструктор для String
String ^S=gcnew String(“Строка!”);
или
string A=”Строка!!!”;
String ^s=gcnew String (A.c_str());
• Во втором примере переменная A имеет тип
string, класс из пространства имен std.
• Переменная преобразуется внутри конструктора
с помощью метода c_str() в переменную типа
char*, которая уже подходит конструктору.

12.

Сложение строк
String ^S;
String ^a=gcnew String(“абв”);
String ^b=”где”;
Object ^c=gcnew String(”жзи”);
S=a+c+b;
Результатом выполнения этих операторов будет
S=”абвгдежзи”.
К уже существующей переменной можно добавить
подстроку:
a=a+”эюя”;
В результате получим a=”абвэюя”.

13.

Извлечение из строки отдельных символов
String ^s;
String ^a=gcnew String (“абв”);
char b[2];
b[0]=a[2];
b[1]=’\0’;
s=gcnew String(b);
Аналогичные действия можно
производить и со строкой wchar_t.

14.

Извлечение из строки отдельных
символов (пояснения)
• Добавлен признак конца в новую строку b, первым
элементом которой стал третий элемент исходной
строки.
• Признака конца строки после объявления b не было.
• Поэтому если не добавить признак конца строки, то
после первого элемента система начнет выдавать
все, что будет следовать за первым элементов, пока
не найдет среди мусора символ признака конца
строки или не остановится стандартным образом.
• После добавления символа ‘\0’ строка b становится
полноценным массивом типа char*.

15.

Добавление символа
String ^s;
String ^a=gcnew String(“абв”);
s=a+1;
Результатом станет s=”абв1”;

16.

Добаление кода символа
String ^s;
String ^a=gcnew String (“абв”);
s=a+’a’;
Результатом станет s=”абв97”;

17.

Добавление десятичного числа
String ^s;
String ^a=gcnew String (“абв”);
s=a+3.1;
Результатом станет s=”абв3.1”;

18.

Сравнение двух строк
String ^a=”абв”;
String ^b=”где”;
if (a!=b) {…}

19.

Проверка на нулевой указатель
• Такая проверка возможна, если переменная
объявлена, но ей не придано никакого значения.
• Даже если переменной присвоить пустое
значение “”, то указатель на нее уже не будет
пуст.
String ^n;
if (n==nullptr) MessageBox::Show
(“Строка
пуста!”);

20.

Методы String
• Compare(s1,s2) – сравнивает две строки и
возвращает одно из трех целочисленных
значений:
– 1 – строка s1 лексикографически больше
строки s2,
– 0 – строки равны,
– –1 – строка s2 лексикографически больше
строки s1.

21.

Методы String
• s1=s2->Concat (s1,s2) – сцепление
двух строк, метод возвращает
строковое значение.
• s1=s->Copy(s) – копирование строки
s в s1.
• s=s1->Insert(2,”*****”) – вставка
подстроки, начиная с указанного
индекса.

22.

Методы String
• Поиск и возврат индекса первого вхождения
подстроки s2 в строку s1:
• int i=s1->IndexOf(s2); - поиск с начала
строки.
• int i=s1->IndexOf(s2,x); - поиск
начинается с заданного индекса x.
• int i=s1->IndexOf(s2,x,y); - поиск
начинается с заданного индекса x и проверяется
заданное количество символов y.

23.

Методы String
• int i=s->LastIndexOf(s1); - поиск и возврат
индекса последнего вхождения заданной подстроки
s1 в строку s.
• int i=s->Length; - определение длины строки s.
• S=s1->Replace (s1,s2) – замена всех
встречающихся в первом параметре символов на
символы второго параметра.
• S=s1->Substring(i); - выделение подстроки с
позиции i до конца строки.
• S=s1->Substring(i,j); - выделение j символов,
начиная с позиции i.
English     Русский Правила