devoid.com.ua - Портал программистов. Все для программиста.
         Новости  Статьи  FAQ  Файлы  Ответы  Блог  Форум     
Статьи
C# (C sharp)
 Начинающим
 Win Forms
 Среда .NET
 C# - научиться или умереть
C / Visual C++
 Основы языка
C++Builder
 Общие вопросы
 Базы данных
 Сеть
Pascal/Delphi
 Основы
 Базы Данных
 Сеть
PHP
 Основы языка
ASP.NET
 Введение
 ADO.NET
Базы данных
 MS SQL Server
 MySQL
 Firebird/InterBase
Описания функций
 WinAPI
 C++/C (Си)
Студентам
 Лабораторные работы по C++


1.5 Манипуляции строками


С# - Научиться или умереть

1.5 Манипуляции строками

  На данный момент, мы могли начать уставать от всех этих чисел и математики, ввода и вывода. Хочется сделать программу, которая делла бы хоть что-нибудь существенное, да? Ну, не надо беспокоиться мы скоро начнем использовать изученный материал. Нам осталось чуть-чуть... Самую малость... Мы уже знаем как управляться с числами, самое время узнать что можно делать с текстом!
  Манипуляция строками (или "текстом") еще удобнее чем использование класса "Math" с числами. Нам не нужен отдельный класс для выполнения специальных функций потому, что каждая строчная переменая переменная уже имеет в себе все, что нам нужно. Например, следующий код выводит в консоль строку состоящюю только из заглавных букв:
string test = " Тестируем различные функции СТРОК!";
Console.WriteLine(test.ToUpper());
А вот и результат:
ТЕСТИРУЕМ РАЗЛИЧНЫЕ ФУНКЦИИ СТРОК!
  А также мы можем сохранить результат конверсии в другой строковой переменной и использовыть ее позже:
string testUpper = test.ToUpper();
Console.WriteLine(testUpper);
  Можем перезаписать значение переменной на конверсию ее же самой:
testUpper = testUpper.ToUpper();
  Просто надо не забывать использовать "=" при присваивании значения конверсии. Следующий код не делает абсолютно ничего:
testUpper.ToUpper();
  Также как использование ReadLine() без присваивания будет бесполезно, использование ToUpper() без присваивания тоже не сохранит результата... Вернее он уйдет в небытие... У ToUpper() есть близнец ToLower(). Интересно что он делает?
  Не будем беспокоиться насчет такого глупого вопроса, поэтому продолжим - анализ строк. Можем использовать свойство строки "Length" для того, чтобы узнать количество символов в ней:
string name = "Bartholomew";
int length = name.Length;
Console.WriteLine("Длина имени: " + length);
  Можно использовать функции StartsWith() и EndsWith() для того, чтобы узнать начинается или заканчивается ли строка определеной последовательностью символов. Смотрим:
Console.WriteLine("Начинается на \"Ba\"?\t" + name.StartsWith("Ba"));
Console.WriteLine("Начинается на \"Bart\"?\t" + name.StartsWith("Bart"));
Console.WriteLine("Начинается на \"Barter\"?\t" + name.StartsWith("Barter"));
Console.WriteLine("Оканчивается на \"mew\"?\t" + name.EndsWith("mew"));
  Первые два утверждения выведут в консоли "True", ведь "Bartholomew" содержит и "Ba", и "Bart". Но, так как оно не начинается с "Barter", то результат третьего утверждения будет "False". Четвертая строка также выдаст "True" - "Bartholomew" оканчивается на "mew". Нам может быть интересно, каким же образом С# знает что писать в консоли - "True" или "False"... Дело в том, что BeginsWith() и EndsWith() возвращают значение такого типа, с которым мы еще не знакомы - "bool" (булевые). Это специальный тип переменных, который может принять только два значения - "True" или "False". Мы увидим в следующей главе, что они очень полезны, а пока просто проигнорируем их...   Еще одна забавная вещь в строках - это возможность поиска отдельных слов и букв в них. Смотрим:
Console.WriteLine("Первый индекс 'B': " + name.IndexOf("B"));
Console.WriteLine("Первый индекс 'a': " + name.IndexOf("a"));
Console.WriteLine("Первый индекс 'r': " + name.IndexOf("r"));
Console.WriteLine("Последний индекс 'o': " + name.LastIndexOf("o"));
В результате получим:
Первый индекс 'B': 0
Первый индекс 'a': 1
Первый индекс 'r': 2
Последний индекс 'o': 7
  На всякий случай oбъясняю: индекс означает позицию. Как видим, методы IndexOf() возвращают позицию искомого символа в строке(можно искать сразу несколько символов или текст, а не просто один символ как сейчас).
  Надо заметить, что позиция(индекс) "В" является 0. Вторая буква, "а" считается на позиции 1 и т.д. Здесь, в С#, отсчет начинается с 0, а не с 1. Придется смириться с этим… LastIndexOf() работает примерно также, только он возвращает позицию последнего искомого символа/строки. Ну, теперь ниже мы можем находить первый и последние индексы в тексте. А что если нам надо найти тот, что между ними? В этом случае, вызываем метод IndexOf(), но уже предоставляем точку отсчета...
int firstIndex = name.IndexOf("o");
Console.WriteLine("Первый индекс'o': " + firstIndex);

int secondIndex = name.IndexOf("o", firstIndex+1);
Console.WriteLine("Второй индекс'o': " + secondIndex);

int thirdIndex = name.IndexOf("o", secondIndex+1);
Console.WriteLine("Третий индекс'o': " + thirdIndex);
Получим:
Первый индекс 'o': 5
Второй индекс 'o': 7
Третий индекс 'o': -1
  вызов IndexOf() такой же как и в первый раз. Во втором случае же мы используем индекс, полученный ранее. Наверное интересно, почему к нему прибавлена единица? Потому что мы хотим продолжить поиск после первого индекса. Если начнем новый поиск с той же позиции, то опять получим первый индекс.
  А что же насчет "-1", который мы получили при третьем вызове функции? Ну, "-1" имеет специальное значение в сфере программирования. Его часто используют для обозначения "неприменимый", или "вне досягаемости". И так как в "Bartholomew" нет третьего "о", становится прекрасно ясно, почему же мы получили результат "вне досягаемости".
А теперь давайте попробуем пару трюков из форматирования. Мы уже знаем как использовать "\t", поэтому попробуем кое-что более зощренное...
string season1 = "весна", season2 = "лето", season3 = "осень", season4 = "зима";
Console.WriteLine(season1.PadLeft(10, '.'));
Console.WriteLine(season2.PadLeft(10, '.'));
Console.WriteLine(season3.PadLeft(10, '.'));
Console.WriteLine(season4.PadLeft(10, '.'));
Код выдаст следующий результат:
.....весна
......лето
.....осень
......зима
  В этом случае, в PadLeft() мы передали 2 параметра: число и символ. (Заметим, что единичные символы заключены в одинарные кавычки, а строки в двойные). Число - это нужная нам длина строки. Как видим, каждая строка длиной в 10 символов. Если строка короче 10 символов, метод "набивает" строку, добавляя слева дополнительные символы, до тех пор, пока строка не достигнет нужной длины. Добавляется тот символ, который мы передали в функции. Существует также метод PadRight() , который делает то же самое, только справа.
  Противоположное "набивке" - урезание. Можно использовать TrimStart() и TrimEnd() чтобы убрать нежелательные символы с начала и конца строки, или Trim() для удаления их с обоих концов. Они настолько просты, что понять можно с первого взгляда:
string rubbish = "......... привет.....";
Console.WriteLine(rubbish);
Console.WriteLine(rubbish.TrimEnd('.'));
Console.WriteLine(rubbish.TrimStart('.'));
Console.WriteLine(rubbish.Trim('.'));
А вот и результат:
.........привет.....
.........привет
привет.....
привет
  Просто, не правда ли? Мы передаем в Trim() тот символ, от которого хотим избавиться и оставляем всю грязную работу на С#. Последнее с чем нужно познакомимся - это подстрока. В программировании много случаев, когда надо "отрезать" определенный "кусочек" строки. Сделать это можно с помощью Substring(). Например:
string name2 = name.Substring(0, 5);
string name3 = name.Substring(4, 2);
string name4 = name.Substring(5, name.Length-5);
Console.WriteLine(name2);
Console.WriteLine(name3);
Console.WriteLine(name4);
Так как переменная "name" у нас все еще "Bartholomew", то получим следующий результат:
Barth
ho
olomew
  Сначала мы передали в Substring() 0 - позицию старта и 5 - длину подстроки. Поэтому она начинается с первой буквы в стоке и продолжается следующими 4 буквами (всего 5 - ровно столько, сколько запросили). Вот почему результат - "Barth".
  Нужно быть осторожным при использовании подстрок. Если запросите ее с параметрами больше длины строки, программа умрет. Например, "Bartholomew" состоит из 11 символов (можно использовотать метод Length, если так охота проверить). если бы мы запросили подстроку, начиная с 10 символа, а затем обрезая следующие 8 , программа умрет. Ведь после десятого есть только один символ!
  Еще одна забавная вещь - возможность вставлять специальные символы в строку. Используем "\u", вместе с кодом спец. символа. Например, "\u263a" вставит ":)" в текст. Чтобы узнать коды всех спец символов можно воспользоваться утилитой "Character Map" из Start Menu\All Programs\Accsessories\System Tools\
  Эти пять уроков, если их прочитать могут дать достаточно сильную основу для базовых навыков. Самое время создать программу, которая действительно будет что-то делать! Но сначала пример кода:
using System;

namespace E_StringManipulation
{
    class Class1
    {
        [STAThread]
        static void Main(string[] args)
        {
            // Конвертируем в строчные и заглавные буквы
            string test = "Testing the various functions of STRINGS!";
            string testUpper = test.ToUpper();
            string testLower = test.ToLower();
            Console.WriteLine(test);
            Console.WriteLine(testUpper);
            Console.WriteLine(testLower);

            // Находим длину, части слова
            string name = "Bartholomew";
            Console.WriteLine(Environment.NewLine + "Name = " + name);
            Console.WriteLine("Длина имени: " + name.Length);
            Console.WriteLine("Начинается на \"Ba\"?\t" + name.StartsWith("Ba"));
            Console.WriteLine("Начинается на \"Bart\"?\t" + name.StartsWith("Bart"));
            Console.WriteLine("Начинается на \"Barter\"?\t" + name.StartsWith("Barter"));
            Console.WriteLine("Оканчивается на \"mew\"?\t" + name.EndsWith("mew"));

            // Находим позицию текста в строке
            Console.WriteLine(Environment.NewLine + "Первый индекс 'B': " + name.IndexOf("B"));
            Console.WriteLine("Первый индекс 'a': " + name.IndexOf("a"));
            Console.WriteLine("Первый индекс 'r': " + name.IndexOf("r"));

            int firstIndex = name.IndexOf("o");
            Console.WriteLine("Первый индекс 'o': " + firstIndex);

            int secondIndex = name.IndexOf("o", firstIndex + 1);
            Console.WriteLine("Второй индекс 'o': " + secondIndex);

            int thirdIndex = name.IndexOf("o", secondIndex + 1);
            Console.WriteLine("Третий индекс 'o': " + thirdIndex);

            Console.WriteLine("Последний индекс 'o': " + name.LastIndexOf("o"));

            // "Набивка"
            string season1 = "весна", season2 = "лето", season3 = "осень", season4 = "зима";
            Console.WriteLine(Environment.NewLine + season1.PadLeft(10, '.'));
            Console.WriteLine(season2.PadLeft(10, '.'));
            Console.WriteLine(season3.PadLeft(10, '.'));
            Console.WriteLine(season4.PadLeft(10, '.'));

            // "Отрезание"
            string rubbish = ".........привет.....";
            Console.WriteLine(Environment.NewLine + rubbish);
            Console.WriteLine(rubbish.TrimEnd('.'));
            Console.WriteLine(rubbish.TrimStart('.'));
            Console.WriteLine(rubbish.Trim('.'));

            // Подстрока
            string name2 = name.Substring(0, 5);
            string name3 = name.Substring(4, 2);
            string name4 = name.Substring(5, name.Length - 5);
            Console.WriteLine(Environment.NewLine + name2);
            Console.WriteLine(name3);
            Console.WriteLine(name4);

            // А теперь попросим пользователя нажать "Enter" для выхода из программы
            Console.WriteLine("Программа завершена. Нажмите \"Enter\" для выхода...");
            Console.ReadLine();

        }
    }
}

***

В данной статье был использован материал из цикла "Professor Mustard Lessons - Learn C# or Die Trying"



  Версия для печати

Информация о статье: "1.5 Манипуляции строками"
  Автор: DrAcid
  Сайт:http://devoid.com.ua/
  Добавлена:12 апреля 2008
  Просмотров:1853



Не нашли ответ на свой вопрос? Задайте вопрос своим коллегам и они Вам ответят!

Задать вопрос

Популярные
   - 1.4 Math в C# (CSharp)
   - 1.2 Переменные в C# (Csharp)
   - 1.1 Вывод в консоль с использованием C# (Csharp)
   - 1.3 Ввод данных в консоль C# (Csharp)


Блог
Купил ноутбук ASUS F3Sg-T575SCCFAW
Начал использовать Zend Framework. Доволен.
Купил цифровой фотоаппарат - Canon PowerShot A580
Получил начальный аттестат Web Money
C# - запуск только одной копии программы

Форум
Ряд Фибоначчи
Работа с компонентами ScrollBar и TextBox
COM порт
!!!В САНКТ-ПЕТЕРБУРГ В КРУПНУЮ КОМПАНИЮ НУЖНЫ СПЕЦИАЛИСТЫ ДЛ
решение задач аналитической геометрии на языке С



© Макагон Сергей (DeVoid) , 2007-2008.