Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие СS_Шульга.doc
Скачиваний:
51
Добавлен:
12.02.2015
Размер:
703.49 Кб
Скачать

Глава 6. Символы и строки

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

  • встроенный тип данных char

  • массивы типа char

  • встроенный тип данных string

  • строки типа StringBuilder

Рассмотрим каждый из них

Встроенный тип данных charпредставляет собой класс, предназначенный для хранения символов в двухбайтовой кодировке Unicode. Класс содержит методы анализа и преобразования символов, некоторые из которых приведены в таблице 1. Подробнее с методами данного класса можно познакомиться в библиотекеMSDN12.

Таблица6. 1.

Методы класса Char

Метод

Описание

GetNumericValue

Возвращает числовое значение символа, если он является цифрой, и –1 в противном случае

IsControl

Возвращает true, если символ является управляющим

IsDigit

Возвращает true, если символ является десятичной цифрой

IsLetter

Возвращает true, если символ является буквой

IsLower

Возвращает true, если символ задан в нижнем регистре

IsUpper

Возвращает true, если символ записан в верхнем регистре

IsWhiteSpace

Возвращает true, если символ является пробельным (пробел, перевод строки и возврат каретки)

Parse

Преобразует строку в символ (строка должна состоять из одного символа)

ToLower

Преобразует символ в нижний регистр

MaxValue, MinValue

Возвращают символы с максимальным и минимальным кодами (эти символы не имеют видимого представления)

Например, является ли символ, введенный с клавиатуры можно проверить следующим образом.

char a = char.Parse(Console.ReadLine());

If (char.IsLetter(a)) Console.WriteLine("Буква");

else Console.WriteLine("Не Буква");

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

char[] a = { 'H', 'e', 'l', 'l', 'о'};

char[]b= "Hello".ToCharArray();

На практике, символьные массивы часто используются как параметры методов класса String.

Встроенный тип данных stringпредставляет собой класс, предназначенный для работы со строками символов в кодировке Unicode

Создать строку можно несколькими способами:

string s1; // инициализация отложена

string s2 = "qqq"; // инициализация строковым литералом

strings3 =newstring(); // инициализация пустой строки

string s4 = new string('a', 10); // конструктор создает строку из 10 символов ‘a’

char[] a = "Hello".ToCharArray(); // массив для инициализации строки

string s5 = new string( a ); // создание из массива символов

strings6=Console.ReadLine();//инициализация строковым литералом

Отметим, что строки типа string относятся к так называемым неизменяемым типам данных. Методы, изменяющие содержимое строки, на самом деле создают новую копию строки. Неиспользуемые "старые" копии автоматически удаляются сборщиком мусора.

Строки типа string являются ссылочным типом данных, однако в классе для них следующие операции, которые работают не со ссылки, а со значения строк:

  • присваивание ( = );

  • проверка на равенство ( == ); (строки равны, если имеют одинаковое количество символов и совпадают посимвольно);

  • проверка на неравенство ( != );

  • обращение по индексу ( [] ) (обращаться к отдельному элементу строки по индексу можно только для получения значения, но не для его изменения) ;

  • сцепление (конкатенация) строк ( + ).

Для получения длины строки используют свойство Length.

В следующем примере с клавиатуры считываются две строки, сравниваются и выводятся поочередно символы из первой и второй строки, а затем «остаток» более длинной строки.

Console.Write("Введите строки: ");

string s1=Console.ReadLine();

string s2= Console.ReadLine();

if (s1 == s2) Console.WriteLine("Строки равны");

else Console.WriteLine("Строки не равны");

if (s1.Length < s2.Length)

{

for (int i = 0; i < s1.Length; i++)

Console.Write("{0}{1}", s1[i], s2[i]);

for (int i = s1.Length; i < s2.Length; i++) Console.Write(s2[i]);

}

else

{

for (int i = 0; i < s2.Length; i++)

Console.Write("{0}{1}",s1[i],s2[i]);

for (int i = s2.Length; i < s1.Length; i++) Console.Write(s1[i]);

}

Если s1= “aaa”,s2= “bbbbb”, то результат работы программы следующий:

Строки не равны

abababbb

В классе String определено множество методов, позволяющих выполнять со строками практически любые действия, некоторые из которых приведены в таблице 2.Подробнее с методами данного класса можно познакомиться в библиотекеMSDN13.

Таблица 6.2.

Методы класса String

Метод

Описание

Compare

Сравнение двух строк в лексикографическом (алфавитном) порядке. Разные реализации метода позволяют сравнивать строки и подстроки с учетом и без учета регистра и особенностей национального представления дат и т. д.

Concat

Конкатенация строк. Метод допускает сцепление произвольного числа строк

Copy

Создание копии строки

Format

Форматирование в соответствии с заданными спецификаторами формата (см. далее)

IndexOf, IndexOfAny, LastIndexOf, LastIndexOfAny

Определение индексов первого и последнего вхождения заданной подстроки или любого символа из заданного набора

Insert

Вставка подстроки в заданную позицию

Join

Слияние массива строк в единую строку. Между элементами массива вставляются разделители (см. далее)

Length

Длина строки (количество символов)

Split

Разделение строки на элементы, используя заданные разделители. Результаты помещаются в массив строк

Substring

Выделение подстроки, начиная с заданной позиции

ToCharArray

Преобразование строки в массив символов

ToLower, ToUpper

Преобразование символов строки к нижнему или верхнему регистру

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

Для выделения слов из строки будем использовать метод string [] Split (char [] A), который возвращает строковый массив, содержащий подстроки данной строки, разделенные элементами заданного массива символов A. В качестве массива A зададим всевозможные разделители слов.

Для каждого слова будем проверять, начинается ли оно с гласной буквы, с помощью метода int IndexOfAny(char[] A) , который возвращает индекс (с отсчетом от нуля) первого обнаруженного в данной строке символа из указанного массива символов A. В качестве A зададим массив гласных букв.

class Program

{

static void Main()

{

Console.Write("Введите строку: ");

string s=Console.ReadLine();

char [] razd = " .;!&,".ToCharArray();//массив разделителей

string []s_new = s.Split(razd);//создание массива слов из строки

char []glas ="aeoiuyAEOIUY".ToCharArray();//массив гласных букв

foreach (string el in s_new)

if (el.IndexOfAny(glas)==0) Console.WriteLine(el);

Console.ReadKey();

}

}

Строки типа string нельзя изменять. Если требуется изменять строки, то рекомендуется использоватькласс StringBuilderиз пространства имен System.Text. Объекты этого класса объявляются только с явным вызовом конструктора класса, например,

StringBuilder s1 =new StringBuilder("ABC");

Над строками этого класса определены те же операции (кроме операции конкатенации +), что и над строками класса String. Причем с помощью операции обращения по индексу ([]) можно не только обратиться к отдельному элементу строки, но и изменять его. Конкатенацию можно заменить вызовом метода Append. Рассмотрим пример, в котором две строки вводятся с клавиатуры, в каждой из них изменяется первый символ, а затем осуществляется их конкатенация.

Console.Write("Введите строки: ");

StringBuilder sb1 = new StringBuilder (Console.ReadLine());

StringBuilder sb2 = new StringBuilder(Console.ReadLine());

sb1[0] = 'A';

sb1[0] = 'A';

sb1.Append(sb2);

Console.WriteLine(sb1);

Если sb1= “bbb”, sb2= “cccc”, то на экран будет выведено “AbbAccc”

Заметим, что у класса StringBuilder методов значительно меньше, чем у класса String, поэтому обычно с таким строками работают следующим образом:

  1. определяется строка класса StringBuilder;

  2. выполняются операции, требующие изменение значения;

  1. полученная строка преобразуется в строку класса String с помощью метода ToString();

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

Например, в следующем коде в начало созданной строки StringBuilder вставляется слово “мама” с помощью метода Insert, и после преобразования в строку классаStringприменяется методSplit.

StringBuilder s1 = new StringBuilder ("мыла раму");

s1.Insert(0, "Мама ");

string s2 = s1.ToString();

foreach (string w in s2.Split(' '))

Console.WriteLine(w);

В результате работы данной программы на экран будет выведено:

Мама

мыла

раму