Работа со строками

Обработка текстовых строк является одной из важнейших задач на современных компьютерах. В языке C# имеются развитые средства по обработке строк. Ранее мы частично рассматривали работу со строками. Здесь разберёмся с этим вопросом более подробно.

Для хранения символьной информации в языке C# используется Unicode. Под один символ отводится 16 бит. Строка в C# представляет собой цепочку символов Unicode и является объектом класса System.String.

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

1)Строку с именем s можно создать так:

string s="Это строка";

2)Строка может содержать различные управляющие символы, например, символ перехода на новую строку '\n':

string s1="Текст в \n две строки";

Если вывести строку s1 на экран монитора, то текст напечатается в две строки:

Текст в

 две строки

3)Можно создавать строки с посимвольным соответствием — в этом случае все символы воспринимаются «как есть», т.е. управляющие символы в таких строках становятся обычными символами. Для того, чтобы показать, что в строке используется посимвольное соответствие, перед строкой записывают символ '@' (Эт-коммерческое). Применим это для текста, который был в строке s1:

string s2=@"Текст в \n две строки";

Здесь строка выведется на печать «как есть»:

Текст в \n две строки

4)Если имеется массив символов Unicode типа char, то его можно преобразовать в строку. Для этого используется конструктор класса String():

char []c={'A','B','C','D','E','F'};

string s=new String(c);

Сейчас в s хранится строка:

ABCDEF

5)Но можно построить новую строку не из всего массива типа char, а из его части:

char []c={'A','B','C','D','E','F'};

int i=2, k=3;

s=new String(c, i, k);

В этом случае строка строится не из всего массива c, а начиная с элемента под номером i, и используется k символов. Вывод строки s на экран даёт следующее:

CDE

6)Можно создать строку, в которой будет многократно повторяться один и тот же символ:

string s=new String('*', 10);

Получится строка из 10 символов «звёздочка».

Замечание. Не пытайтесь таким способом получать строку из строк. Вариант

string s = new String("*", 10);

работать не будет ("*" — это строка, а '*' — это символ).

Консольный ввод-вывод строк

Выполняется просто. Достаточно использовать стандартные методы ReadLine() и WriteLine() класса Console:

string s;

Console.WriteLine("Задайте строку:");

s=Console.ReadLine();

Console.WriteLine("s="+s);

Обращение к отдельным элементам строки

Если в строке имеется какая-либо информация, то можно эту строку обрабатывать посимвольно как массив. Индексы в строке так же начинаются с 0. Текущая длина определяется свойством Length:

int k = 0;

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

   if(s[i] >= '0' && s[i] <= '9')

      k++;

Console.WriteLine("k={0}", k);

На экран будет выведено количество цифр, найденных в этой строке. Но здесь, как не сложно понять, к элементу строки используется доступ по чтению. А что будет, если мы попробуем менять символы в строке? Например, заменим все символы '2' на '5':

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

   if(s[i] == '2')

      s[i] = '5';

Console.WriteLine("s="+s);

В этом случае для строки

      s[i] = '5';

будет выдано сообщение об ошибке:

Невозможно присвоить значение свойству или индексатору 'string.this[int]' -- доступ только для чтения (CS0200)

Решить проблему можно двумя путями: использовать методы класса String (для замены подойдёт метод Replace()) или отказаться от класса String и использовать класс StringBuilder, для которого допустимо изменение отдельных элементов строки (так же, как это делалось в массиве).

Операции над строками

Для строк допустимы операция присваивания (смотри выше), сцепление строк (в конец первой строки добавляется вторая) и проверка на равенство или неравенство. Другие операции не допустимы.

1)Сцепление (слияние) строк:

string s1="122", s2="123";

string s1 = s + s2;

Console.WriteLine(s1);

На экран будет выведено:

122123

2)Проверка на равенство (==) или на неравенство (!=):

string s1="122", s2="123";

if(s==s2)

   Console.WriteLine("Равны");

else

   Console.WriteLine("Неравны");

Здесь будет напечатано:

Неравны

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

Для строк в языке C# существует большое количество готовых методов, позволяющие выполнять различные действия над строками. Рассмотрим наиболее употребительные из них.

1)Конкатенация (сцепление, слияние) строк — используется статический метод Concat():

string s = "123", s1 = "45";

s=String.Concat(s, s1);

Console.WriteLine(s);

Результатом будет строка, содержащая обе исходные строки:

12345

Интересно применение метода Concat() для объединения массива строк:

string []x={"Один ","Два ","Три"};

s=String.Concat(x);

Console.WriteLine(s);

Результатом будет строка:

Один Два Три

2)Копирование строки выполняется с помощью статического метода Copy():

string s2 = String.Copy(s);

Тоже самое можно получить и с помощью оператора присваивания:

s2=s;

3)Получение подстроки — используется метод Substring(), например:

s = "Язык программирования C#";

s2 = s.Substring(12, 3);

Console.WriteLine(s2);

Здесь из исходной строки s, начиная с позиции 12, копируется 3 символа и полученный результат заносится в строку s2. На экране будет выведено:

мир

4)Вставка подстроки — в заданную позицию (2) исходной строки s включаем подстроку ("AB"):

string s = "12345"

s2 = s.Insert(2, "AB");

Результатом будет строка s2, равная:

12AB345

5)Замена символов и строк — используется метод Replace(). Имеется два варианта. Рассмотрим их оба.

а)Замена символов. Заменим в строке s все вхождения символа '2' на '5':

string s = "123422";

string s1 = s.Replace('2', '5');

Console.WriteLine(s1);

Полученный результат:

153455

Как видим, рассматриваемая ранее задача (попытка замены s[i]='5') при использовании метода Replace() решается предельно просто.

б)Замена строк. Заменим все слова "abc" на "alfa":

s="abc abc";

string s1 = s.Replace("abc", "alfa");

Console.WriteLine(s1);

Полученный результат:

alfa alfa

К стати. Метод Replace() работает корректно даже в том случае, когда делается замена на строку, которая является расширением исходной. Например, заменим в тексте все вхождения слова "child" на "children":

s="child_child_child";

string s1 = s.Replace("child", "children");

Console.WriteLine(s1);

Как видно из выведенного на экран текста, всё получилось так, как и ожидалось:

children_children_children

6)Удаление символов из строки (метод Remove()) — в строке s удаляем k символов, начиная с позиции i:

string s = "123429";

int i=2, k=3;

s1=s.Remove(i, k);

Console.WriteLine(s1);

Полученный результат:

129

7)Поиск индекса первого вхождения символа в строке (метод IndexOf()):

string s = "It is false";

int i = s.IndexOf('f');

Console.WriteLine("i={0}", i);

Полученный результат (позиция символа 'f'):

i=6

8)Поиск первого вхождения любого из символов массива в строке (метод IndexOfAny()) — в строке s ищется позиция первого вхождения любого из символов массива x:

string s = "do{ for(";

char []x = {'{', '('};

int i = s.IndexOfAny(x);

Console.WriteLine("i={0}",i);

Полученный результат (позиция символа '{'):

i=2

9)Поиск индекса последнего вхождения символа в строке (метод LastIndexOf()):

string s = "It is false for";

int i = s.LastIndexOf('f');

Console.WriteLine("i={0}",i);

Полученный результат (позиция последнего символа 'f'):

i=12

10)Поиск последнего вхождения любого из символов массива в строке — в строке s ищется позиция последнего вхождения любого из символов массива x (метод LastIndexOfAny()):

string s = "do{ for(";

char []x = {'{', '('};

int i = s.LastIndexOfAny(x);

Console.WriteLine("i={0}", i);

Полученный результат (позиция символа '('):

i=7

Пример 1. Дана символьная строка s, известно, что в этой строке есть хотя бы один символ «точка». Преобразовать строку, удалив из неё запятые, предшествующие первой точке, и заменив знаком * все символы пробела, встречающиеся после первой точки.

Возможная реализация:

using System;

namespace Prim_String

{

   class Program

   {

      public static void Main(string[] args)

      {

         string s = "qwerty, t, r . abc f t";

         Console.WriteLine("Исходная строка:\n"+s);

         int k = s.IndexOf(".");

         Console.WriteLine("Первая точка находится в позиции: "+k);

         string s1 = s.Substring(0, k);

         Console.WriteLine(s1);

         int i;

         do{

            i = s1.IndexOf(',');

            if(i >= 0)

               s1 = s1.Remove(i, 1);

         }while(i >= 0);

         Console.WriteLine(s1);

         string s2 = s.Substring(k);

         Console.WriteLine(s2);

         s2 = s2.Replace(' ', '*');

         Console.WriteLine(s2);

         s = s1 + s2;

         Console.WriteLine("Результирующая строка:\n"+s);

         Console.Write("Press any key to continue . . . ");

         Console.ReadKey(true);

      }

   }

}

Результат работы:

Исходная строка:

qwerty, t, r . abc f t

Первая точка находится в позиции: 13

qwerty, t, r

qwerty t r

. abc f t

.*abc*f*t

Результирующая строка:

qwerty t r .*abc*f*t

Press any key to continue . . .



Назад
На верх
Вперёд
Hosted by uCoz