Обработка текстовых строк является одной из важнейших задач на современных компьютерах. В языке 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 . . .
|
|
|
|