Manipulating Characters in a String
The String class has a number of methods for examining the contents of strings, finding characters or substrings within a string, changing case, and other tasks.
Getting Characters and Substrings by Index
You can get the character at a particular index within a string by invoking the charAt() accessor method. The index of the first character is 0, while the index of the last character is length()-1 . For example, the following code gets the character at index 9 in a string:
Indices begin at 0, so the character at index 9 is 'O', as illustrated in the following figure:
If you want to get more than one consecutive character from a string, you can use the substring method. The substring method has two versions, as shown in the following table:
| Method | Description |
|---|---|
| String substring(int beginIndex, int endIndex) | Returns a new string that is a substring of this string. The substring begins at the specified beginIndex and extends to the character at index endIndex — 1 . |
| String substring(int beginIndex) | Returns a new string that is a substring of this string. The integer argument specifies the index of the first character. Here, the returned substring extends to the end of the original string. |
The following code gets from the Niagara palindrome the substring that extends from index 11 up to, but not including, index 15, which is the word "roar":
Other Methods for Manipulating Strings
Here are several other String methods for manipulating strings:
| Method | Description |
|---|---|
| String[] split(String regex) String[] split(String regex, int limit) |
Searches for a match as specified by the string argument (which contains a regular expression) and splits this string into an array of strings accordingly. The optional integer argument specifies the maximum size of the returned array. Regular expressions are covered in the lesson titled "Regular Expressions." |
| CharSequence subSequence(int beginIndex, int endIndex) | Returns a new character sequence constructed from beginIndex index up until endIndex — 1. |
| String trim() | Returns a copy of this string with leading and trailing white space removed. |
| String toLowerCase() String toUpperCase() |
Returns a copy of this string converted to lowercase or uppercase. If no conversions are necessary, these methods return the original string. |
Searching for Characters and Substrings in a String
Here are some other String methods for finding characters or substrings within a string. The String class provides accessor methods that return the position within the string of a specific character or substring: indexOf() and lastIndexOf() . The indexOf() methods search forward from the beginning of the string, and the lastIndexOf() methods search backward from the end of the string. If a character or substring is not found, indexOf() and lastIndexOf() return -1.
The String class also provides a search method, contains , that returns true if the string contains a particular character sequence. Use this method when you only need to know that the string contains a character sequence, but the precise location isn't important.
The following table describes the various string search methods.
| Method | Description |
|---|---|
| int indexOf(int ch) int lastIndexOf(int ch) |
Returns the index of the first (last) occurrence of the specified character. |
| int indexOf(int ch, int fromIndex) int lastIndexOf(int ch, int fromIndex) |
Returns the index of the first (last) occurrence of the specified character, searching forward (backward) from the specified index. |
| int indexOf(String str) int lastIndexOf(String str) |
Returns the index of the first (last) occurrence of the specified substring. |
| int indexOf(String str, int fromIndex) int lastIndexOf(String str, int fromIndex) |
Returns the index of the first (last) occurrence of the specified substring, searching forward (backward) from the specified index. |
| boolean contains(CharSequence s) | Returns true if the string contains the specified character sequence. |
Replacing Characters and Substrings into a String
The String class has very few methods for inserting characters or substrings into a string. In general, they are not needed: You can create a new string by concatenation of substrings you have removed from a string with the substring that you want to insert.
The String class does have four methods for replacing found characters or substrings, however. They are:
| Method | Description |
|---|---|
| String replace(char oldChar, char newChar) | Returns a new string resulting from replacing all occurrences of oldChar in this string with newChar. |
| String replace(CharSequence target, CharSequence replacement) | Replaces each substring of this string that matches the literal target sequence with the specified literal replacement sequence. |
| String replaceAll(String regex, String replacement) | Replaces each substring of this string that matches the given regular expression with the given replacement. |
| String replaceFirst(String regex, String replacement) | Replaces the first substring of this string that matches the given regular expression with the given replacement. |
An Example
The following class, Filename , illustrates the use of lastIndexOf() and substring() to isolate different parts of a file name.
Here is a program, FilenameDemo , that constructs a Filename object and calls all of its methods:
And here's the output from the program:
As shown in the following figure, our extension method uses lastIndexOf to locate the last occurrence of the period (.) in the file name. Then substring uses the return value of lastIndexOf to extract the file name extension — that is, the substring from the period to the end of the string. This code assumes that the file name has a period in it; if the file name does not have a period, lastIndexOf returns -1, and the substring method throws a StringIndexOutOfBoundsException .
Also, notice that the extension method uses dot + 1 as the argument to substring . If the period character (.) is the last character of the string, dot + 1 is equal to the length of the string, which is one larger than the largest index into the string (because indices start at 0). This is a legal argument to substring because that method accepts an index equal to, but not greater than, the length of the string and interprets it to mean "the end of the string."
22.4 – Доступ к символам std::string и преобразование в массивы в стиле C
Есть два почти идентичных способа доступа к символам в строке. Более простой и быстрой версией является перегруженный operator[] :
char& string::operator[] (size_type nIndex)
const char& string::operator[] (size_type nIndex) const
Обе эти функции возвращают символ с индексом nIndex .
- Передача недопустимого индекса приводит к неопределенному поведению.
- Использование length() в качестве индекса допустимо только для константных строк и возвращает значение, сгенерированное конструктором строки по умолчанию. Делать это не рекомендуется.
- Поскольку возвращаемым типом является char& , вы можете использовать его для редактирования символов в строке.
Также есть еще и неоператорная версия. Эта версия работает медленнее, поскольку использует исключения для проверки допустимости nIndex . Если вы не уверены, допустимо ли значение nIndex , то для доступа к символам строки вы должны использовать эту версию:
char& string::at(size_type nIndex)
const char& string::at(size_type nIndex) const
Обе эти функции возвращают символ с индексом nIndex .
- Передача недопустимого индекса приводит к исключению out_of_range .
- Поскольку возвращаемым типом является char& , вы можете использовать его для редактирования символов в строке.
Преобразование в массивы в стиле C
Многие функции (включая все функции C) ожидают, что строки будут в формате строк в стиле C, а не в виде std::string . По этой причине std::string предоставляет 3 различных способа преобразования объектов std::string в строки в стиле C.
const char* string::c_str() const
Возвращает содержимое строки как константную строку в стиле C.
- Добавляется завершающий ноль.
- Строка в стиле C принадлежит объекту std::string и не должна удаляться.
const char* string::data() const
Возвращает содержимое строки как константную строку в стиле C.
- Добавляется завершающий ноль. Эта функция выполняет то же действие, что и c_str() .
- Строка в стиле C принадлежит объекту std::string и не должна удаляться.
size_type string::copy(char *szBuf, size_type nLength) const
size_type string::copy(char *szBuf, size_type nLength, size_type nIndex) const
Оба варианта копируют не более nLength символов строки в szBuf , начиная с символа nIndex .
- Возвращается количество скопированных символов.
- Завершающий ноль не добавляется. Вызывающий должен обеспечить инициализацию szBuf значением NULL или завершить строку, используя возвращенную длину.
- Вызывающий отвечает за непереполнение szBuf .
Если вам не нужна максимальная эффективность, c_str() – самая простая и безопасная для использования функция из трех показанных выше.
Как обратиться к элементу строки
Обработка текстовых строк является одной из важнейших задач на современных компьютерах. В языке C# имеются развитые средства по обработке строк. Ранее мы частично рассматривали работу со строками. Здесь разберёмся с этим вопросом более подробно.
Для хранения символьной информации в языке C# используется Unicode . Под один символ отводится 16 бит. Строка в C# представляет собой цепочку символов Unicode и является объектом класса System.String .
Создание строки
1)Строку с именем s можно создать так:
2)Строка может содержать различные управляющие символы, например, символ перехода на новую строку ‘\n’ :
string s1="Текст в \n две строки";
Если вывести строку s1 на экран монитора, то текст напечатается в две строки:
3)Можно создавать строки с посимвольным соответствием — в этом случае все символы воспринимаются «как есть», т.е. управляющие символы в таких строках становятся обычными символами. Для того, чтобы показать, что в строке используется посимвольное соответствие, перед строкой записывают символ ‘@’ (Эт-коммерческое). Применим это для текста, который был в строке s1 :
string s2=@"Текст в \n две строки";
Здесь строка выведется на печать «как есть»:
Текст в \n две строки
4)Если имеется массив символов Unicode типа char , то его можно преобразовать в строку. Для этого используется конструктор класса String() :
string s=new String(c);
Сейчас в s хранится строка:
5)Но можно построить новую строку не из всего массива типа char , а из его части:
s=new String(c, i, k);
В этом случае строка строится не из всего массива c , а начиная с элемента под номером i , и используется k символов. Вывод строки s на экран даёт следующее:
6)Можно создать строку, в которой будет многократно повторяться один и тот же символ:
string s=new String(‘*’, 10);
Получится строка из 10 символов «звёздочка».
Замечание . Не пытайтесь таким способом получать строку из строк. Вариант
string s = new String("*", 10);
работать не будет ( "*" — это строка, а ‘*’ — это символ).
Консольный ввод-вывод строк
Выполняется просто. Достаточно использовать стандартные методы ReadLine() и WriteLine() класса Console :
Обращение к отдельным элементам строки
Если в строке имеется какая-либо информация, то можно эту строку обрабатывать посимвольно как массив. Индексы в строке так же начинаются с 0 . Текущая длина определяется свойством Length :
for(int i = 0; i < s.Length; i++)
На экран будет выведено количество цифр, найденных в этой строке. Но здесь, как не сложно понять, к элементу строки используется доступ по чтению. А что будет, если мы попробуем менять символы в строке? Например, заменим все символы ‘2’ на ‘5’ :
for(int i = 0; i < s.Length; i++)
В этом случае для строки
будет выдано сообщение об ошибке:
Невозможно присвоить значение свойству или индексатору ‘string.this[int]’ — доступ только для чтения (CS0200)
Решить проблему можно двумя путями: использовать методы класса String (для замены подойдёт метод Replace() ) или отказаться от класса String и использовать класс StringBuilder , для которого допустимо изменение отдельных элементов строки (так же, как это делалось в массиве).
Операции над строками
Для строк допустимы операция присваивания (смотри выше), сцепление строк (в конец первой строки добавляется вторая) и проверка на равенство или неравенство. Другие операции не допустимы.
1) Сцепление (слияние) строк:
string s1 = s + s2;
На экран будет выведено:
2) Проверка на равенство ( == ) или на неравенство ( != ):
Здесь будет напечатано:
Методы по обработке строк
Для строк в языке C# существует большое количество готовых методов, позволяющие выполнять различные действия над строками. Рассмотрим наиболее употребительные из них.
1) Конкатенация (сцепление, слияние) строк — используется статический метод Concat() :
Результатом будет строка, содержащая обе исходные строки:
Интересно применение метода Concat() для объединения массива строк:
Результатом будет строка:
2) Копирование строки выполняется с помощью статического метода Copy() :
string s2 = String.Copy(s);
Тоже самое можно получить и с помощью оператора присваивания:
3) Получение подстроки — используется метод Substring() , например:
s = "Язык программирования C#";
s2 = s.Substring(12, 3);
Здесь из исходной строки s , начиная с позиции 12 , копируется 3 символа и полученный результат заносится в строку s2 . На экране будет выведено:
4) Вставка подстроки — в заданную позицию ( 2 ) исходной строки s включаем подстроку ( "AB" ):
Результатом будет строка s2 , равная:
5) Замена символов и строк — используется метод Replace() . Имеется два варианта. Рассмотрим их оба.
а) Замена символов . Заменим в строке s все вхождения символа ‘2’ на ‘5’ :
string s1 = s.Replace(‘2’, ‘5’);
Как видим, рассматриваемая ранее задача (попытка замены s[i]=’5′ ) при использовании метода Replace() решается предельно просто.
б) Замена строк . Заменим все слова "abc" на "alfa" :
К стати . Метод Replace() работает корректно даже в том случае, когда делается замена на строку, которая является расширением исходной. Например, заменим в тексте все вхождения слова "child" на "children" :
string s1 = s.Replace("child", "children");
Как видно из выведенного на экран текста, всё получилось так, как и ожидалось:
6) Удаление символов из строки (метод Remove () ) — в строке s удаляем k символов, начиная с позиции i :
7) Поиск индекса первого вхождения символа в строке (метод IndexOf () ):
string s = "It is false";
int i = s.IndexOf(‘f’);
Полученный результат (позиция символа ‘f’ ):
8) Поиск первого вхождения любого из символов массива в строке (метод IndexOfAny() ) — в строке s ищется позиция первого вхождения любого из символов массива x :
int i = s.IndexOfAny(x);
Полученный результат (позиция символа ‘<' ):
9) Поиск индекса последнего вхождения символа в строке (метод LastIndexOf () ):
string s = "It is false for";
int i = s.LastIndexOf(‘f’);
Полученный результат (позиция последнего символа ‘f’ ):
10) Поиск последнего вхождения любого из символов массива в строке — в строке s ищется позиция последнего вхождения любого из символов массива x ( метод LastIndexOfAny() ):
int i = s.LastIndexOfAny(x);
Полученный результат (позиция символа ‘(‘ ):
Пример 1 . Дана символьная строка s , известно, что в этой строке есть хотя бы один символ «точка». Преобразовать строку, удалив из неё запятые, предшествующие первой точке, и заменив знаком * все символы пробела, встречающиеся после первой точки.
How can I get a character in a string by index?
I know that I can return the index of a particular character of a string with the indexof() function, but how can I return the character at a particular index?
![]()
2 Answers 2
See also Substring , to return more than one character.
Do you mean like this
string also implements IEnumberable<char> so you can also enumerate it like this
-
The Overflow Blog
Linked
Related
Hot Network Questions
Subscribe to RSS
To subscribe to this RSS feed, copy and paste this URL into your RSS reader.
Site design / logo © 2023 Stack Exchange Inc; user contributions licensed under CC BY-SA . rev 2023.3.11.43304
By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.