Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по строкам.pdf
Скачиваний:
49
Добавлен:
15.04.2015
Размер:
372.89 Кб
Скачать

Строки в С#

ссылке на объекты типа string), а иначе они для нашей программы будут потеряны (ими займется сборщик мусора).

Если нужно искать в тексте не фрагмент, а одиночный символ, то можно воспользоваться перегруженным вариантом метода IndexOf() принимающим символ в качестве первого параметра:

string Text = "Moscow"; char ch = 's';

int ind;

ind = Text.IndexOf( ch, 0 );

В результате выполнения данного фрагмента кода переменная ind станет равной 2, так как символ 's' входит в строку "Moscow" напозициис индексом 2.

Метод IndexOf() выполняет поиск с учетом регистра символов. Если нужно выполнить поиск без учета регистра символов, то можно исходный текст и искомый фрагмент привести сначала к одному и тому же регистру с помощью методов ToLower() или ТоUрреr() класса

String

Text = Text.ToUpper();

Frag = Frag.ToUpper();

итолько потомвыполнить поиск методом IndexOf ().

Про работу иных методов класса String всегда можно узнать в справочной системе компилятораMicrosoft Visual С#.

4 Массивы строк в языке С#

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

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

string[] strArr = null; strArr = new string[3]; strArr[0] = "first"; strArr[1] = "second"; strArr[2] = "third";

либоприменить болеекороткую «инициализационную» форму:

string[] strArr = new string[3]{"first","second","third"};

17

Строки в С#

В любом случае массив strArr [] после этого содержит три элемента, каждый из которых является ссылкой на объект-строку в памяти компьютера, что с помощью окна Quick Watch визуализируется достаточнонаглядно .

Рисунок 11

Проще простого вывести для обозрения содержимое массива strArr и в собственной программе:

Листинг 11

namespace string_app

{

class Program

{

static void Main(string[] args)

{

string[] strArr = new string[3] { "second", "first", "third" }; for (int i = 0; i < strArr.Length; ++i)

Console.WriteLine(strArr[i]);

}

}

}

Абсолютно очевидный и ожидаемый нами результат ее вывода в консольное окно показан нарис. 12.

Рисунок 12

Если перед выводом содержимого массива строк отсортировать его статическим методом

Sort () классаArray

18

Строки в С#

Array.Sort( strArr );

то выводстрок будет осуществлён в лексикографическомпорядке (см. рис. 13).

Рисунок 13

Мы специально в учебных целях в Листинге 11 применили операцию индексации для доступа к отдельным строкам массива strArr. На самом деле этот доступ удобнее и проще осуществлять в цикле foreach, пример использования которого мы рассмотрим чуть ниже, а сейчас мы поступим (опять-таки в учебных целях) прямо наоборот - пойдём ещё более трудным и громоздким путём, осуществляя вывод строк массива strArr посимвольно (с теми же самыми картинкамив консольномокне, что показаны нарис. 12 или 13):

Листинг 12

1.

for(

int i =

0;

i

< strArr.Length; ++i

)

2.

{

int j

= 0;

j

< strArr[i].Length;

++j )

3.

for(

4.Console.Write( strArr[i][j] );

5.Console.WriteLine();

6.}

Здесь методWrite () осуществляет выводсимволов (представлены выражением strArr [ i ] [ j]) i-ой строки массива в одну и ту же физическую строку экрана, после чего метод WriteLine() переходит к следующей физической строке (то есть осуществляет «перевод строки»).

Как мы и обещали выше, сразу же послеучебныхупражнений в техническихусложнениях кодаЛистинга 12 перейдёмк егопрактическому упрощения с помощью цикла foreach:

foreach( string el in strArr ) Console.WriteLine( el );

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

Цикл foreach как нельзя лучше подходит для решения задачи о расщеплении текстовой строки на отдельные её фрагменты, отделённые друг от друга так называемыми разделителями (separators). К стандартным разделителям относят точку, запятую и пробел, но

19

Строки в С#

в методе Split(), выполняющем данную задачу, их можно указать явно в качестве второго параметра:

Листинг 13

7. namespace string_app

1.{

2.class Program

3.{

4.static void Main(string[] args)

5.{

6.string str = "second, first, third";

7.char[] sep = new char[3] { '.', ',', ' ' };

8.foreach (string s in str.Split(sep))

9.Console.WriteLine(s);

10.}

11.}

12.}

Программа с Листинга 13 разбивает с помощью метода Split() библиотечного класса String

исходную строку "second, first, third" на три подстроки ("second", "first" и "third"), и с помощью цикла foreach выводит каждую изнихв консольноеокно.

5 Краткие выводы

Строка в C# — это массив знаков, объявленный с помощью ключевого слова string.

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

string s = "Hello, World!";

Переприсваивание Строки можноцеликомпереприсваивать:

string s1 = "Hello";

string s2 = s1; //переприсваиваем

Объединение строк Можно объединять строки с помощью оператора+, как показанов следующемпримере:

string s1 = "orange"; string s2 = "red"; s1 += s2;

Console.WriteLine(s1); // напечатается "orangered"

Escape-знаки

20

Строки в С#

Строки могут содержать escape-знаки, такиекак "\n" (новая строка) и "\t" (табуляция). Пример:

string hello = "Hello\nWorld!"; Console.WriteLine(hello);

/* Напечатается Hello

World!

*/

string s = "чтобы вставить \"кавычки\" в строку используем обратный слэш"; Console.WriteLine(s);

Если требуется добавить в строку обратную косую черту, перед ней нужно поставить еще одну обратную косую черту. Следующая строка:

string filePath = "\\\\My Documents\\"; Console.WriteLine(filePath);

/* Напечатается: \\My Documents\ */

Точные строки: символ @

Символ @ служит для того, чтобы конструктор строк пропускал escape-знаки и переносы строки. Следующиедвестроки являются идентичными:

string p1 = "\\\\My Documents\\My Files\\"; string p2 = @"\\My Documents\My Files\";

Чтобы поставить в точной строке знак двойных кавычек, нужно использовать по дватаких знака, как показанов следующемпримере:

string s = @"You say ""goodbye"" and I say ""hello""";

Доступ к отдельным знакам

Квадратные скобки [] служат для доступа к отдельным знакам в объекте string, но при этом возможендоступ толькодля чтения:

string str = "test";

char x = str[2]; // x = 's'; string s5 = "Printing backwards"; for (int i = 0; i < s5.Length; i++)

Console.Write(s5[s5.Length - i - 1]); // напечатается "sdrawkcab gnitnirP"

21

Строки в С#

Извлечение подстрок

Для извлечения подстроки из строки используется методSubstring.

string s3 = "Visual C# Express";

string s4 = s3.Substring(7, 2); Console.WriteLine(s4);

// напечатается "C#"

Замена по образцу

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

string s3 = "Visual C# Express";

string s5 = s3.Replace("C#", "Basic"); Сonsole.WriteLine(s5);

// напечатается "Visual Basic Express"

Смена регистра

Чтобы изменить регистр букв в строке (сделать их заглавными или строчными) следует использовать ToUpper() или ToLower(), как показанов следующемпримере:

string s6 = "РгРтУ"; Console.WriteLine(s6.ToUpper()); // Напечатается РГРТУ Console.WriteLine(s6.ToLower());

//Напечатается ргрту Console.WriteLine(s6);

//Напечатается РгРтУ

Сравнения

Самый простой способ сравнения двух строк использовать операторы == и !=, осуществляющие сравнение с учетомрегистра:

string color1 = "red"; string color2 = "green"; string color3 = "red"; if (color1 == color3)

Console.WriteLine("Строки равны"); if (color1 != color2)

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

Не допускается использование >,<,>=,<= для сравнения строк. Для строковых объектов существует метод CompareTo(), возвращающий целочисленное значение, зависящее от того,

22

Строки в С#

что одна строка может быть меньше (<), равна (==) или больше другой (>). При сравнении строк используется значение Юникода, при этом значение строчных букв меньше, чем значениезаглавных.

string string1 = "ИИТ"; string string2 = "Иит";

int result = string1.CompareTo(string2); if (result > 0)

Console.WriteLine("{0} больше чем {1}", string1, string2); else if (result == 0)

Console.WriteLine("{0} равно {1}", string1, string2); else if (result < 0)

Console.WriteLine("{0} меньше чем {1}", string1, string2); // Напечатается ИИТ больше чем Иит

Удаление фрагментов и вставка строк в строки

Может быть выполненас помощью методов Remove и Insert:

string x = "ZX Spectrum"; x=x.Remove(2, 1);

x = x.Insert(2,"-"); Console.WriteLine(x); Console.ReadKey();

Пустые строки

Пустая строка это экземпляробъекта String, содержащий0 знаков.

Пустые строки часто используются в различных сценариях программирования, представляя пустое текстовое поле. Для пустых строк можно вызывать методы, потому что такие строки являются допустимыми объектами String. Пустые строки инициализируются следующимобразом:

string s = "";

Массивы из строк

Могут быть инициализированы начальными значениями:

string[] x = { "Астраханская обл.", "Знаменск"}; Console.WriteLine(x[0]);

//напечатается Астраханская обл. Console.WriteLine(x[1][0]);

23

Строки в С#

//напечатается З

Разбиение строк

Следующий пример кода демонстрирует возможность разбора строки при помощи метода String.Split. Работа метода заключается в возврате массива строк, в котором каждый элемент представляет слово. В качестве ввода Split принимает массив символов, определяющихкакие символы должны использоваться в качестве разделителей. В этом примере используются пробелы, запятые, точки, двоеточия и табуляция. Массив, содержащий эти разделители, передается в Split, и каждое слово в предложении выводится отдельно при помощи результирующегомассива строк.

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

char razdelitel = ' ';

string text = "Шла Саша по шоссе и сосала сушку"; Console.WriteLine("Исходный текст: {0}", text); string[] words = text.Split(razdelitel); Console.WriteLine("{0} слов в тексте:", words.Length); foreach (string s in words)

Console.WriteLine(s);

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

char[] delimiterChars = { ' ', ',', '.', ':', '\t' }; string text = "one\ttwo three:four,five six seven"; Console.WriteLine("Original text: '{0}'", text); string[] words = text.Split(delimiterChars); Console.WriteLine("{0} words in text:", words.Length); foreach (string s in words)

Console.WriteLine(s);

Пример: Ввести текстовую строку. Напечатать слова, в которых первая буква встречается ещехотя бы раз.

Console.Write("Введите предложение: "); string s=Console.ReadLine();

string[] words= s.Split(' ','.',','); foreach (string word in words)

{

char c=word[0]; bool flag = false; int i=1;

while (i < word.Length & !flag)

{

if (word[i] == c) flag = true; i++;

24