Строки
Строка – это текст: слово, фраза, предложение, любое сообщение, состоящее из символов.
В Java для работы с текстом используется тип String.
Строки удобно использовать для имён, названий, сообщений, вводимых пользователем.
Основное
Строковая переменная объявляется так:
Примеры:
Важно:
- строка записывается в двойных кавычках:
"Java"; - тип
Stringпишется с большой буквы; - строка может быть и пустой (
"").
Создание строк
Основной способ – строковый литерал:
Можно собирать строку из чисел и других значений:
int age = 12;
double score = 4.5;
String info = "Возраст: " + age + ", балл: " + score;
// "Возраст: 12, балл: 4.5"
Есть и другие способы (через String.valueOf, конструкторы и т.п.), но в большинстве задач хватает литералов и конкатенации.
Длина строки и доступ к символам
У строки есть длина – количество символов.
Нумерация символов начинается с 0.
String s = "Java";
int n = s.length(); // 4
char c0 = s.charAt(0); // 'J'
char c1 = s.charAt(1); // 'a'
Полезно помнить:
- последний символ имеет индекс
length() - 1; - если обратиться к несуществующему индексу, будет ошибка выполнения.
Конкатенация (склейка) строк
Строки можно склеивать оператором +.
Числа и другие типы при этом автоматически превращаются в текст.
String firstName = "Иван";
String lastName = "Петров";
String fullName = firstName + " " + lastName;
// "Иван Петров"
С числами:
Сравнение строк
Строки нельзя сравнивать по содержимому через ==.
Для сравнения текста используются методы equals и equalsIgnoreCase.
String s1 = "hello";
String s2 = "hello";
String s3 = "Hello";
boolean a = s1.equals(s2); // true
boolean b = s1.equals(s3); // false
boolean c = s1.equalsIgnoreCase(s3); // true
== проверяет, совпадают ли ссылки (адреса), а не текст.
Для задач с текстом по содержимому всегда используем equals.
Подстроки и поиск
Часть строки можно получить методом substring:
Индексы считаются с 0, правый предел (endIndex) не входит.
Поиск подстроки:
String s = "abracadabra";
int p1 = s.indexOf("bra"); // 1
int p2 = s.indexOf("cad"); // 4
int p3 = s.indexOf("xyz"); // -1 (нет вхождения)
Разбиение строки
Метод split разбивает строку на части по разделителю и возвращает массив строк.
Частый случай – разделение по пробелу или запятой.
Чтение строк с клавиатуры
Через Scanner строки читают так:
Scanner in = new Scanner(System.in);
String word = in.next(); // одно слово (до пробела)
String line = in.nextLine(); // вся строка целиком
Если перед nextLine() уже читали числа (nextInt, nextDouble и т.п.), между ними часто нужна «промывка» строки:
int n = in.nextInt();
in.nextLine(); // читаем остаток строки
String text = in.nextLine(); // теперь читаем настоящую строку
Типичные шаблоны
Подсчёт длины строки
Проверка префикса и суффикса
String s = in.nextLine();
if (s.startsWith("java")) {
System.out.println("начинается с java");
}
if (s.endsWith(".txt")) {
System.out.println("это текстовый файл");
}
Сравнение строк без учёта регистра
String answer = in.nextLine();
if (answer.equalsIgnoreCase("yes")) {
System.out.println("ДА");
} else {
System.out.println("НЕТ");
}
Что нужно запомнить
Строки в Java хранятся в типе String и записываются в двойных кавычках:
Длину строки даёт метод length(), отдельный символ – charAt(i).
Для сравнения строк по содержимому используется equals / equalsIgnoreCase, а не оператор ==.
Строки удобно склеивать оператором +, при этом числа автоматически превращаются в текст.
Методы и операции контейнера string
Работа со строками в C++ во многом похожа на работу с vector.
Создать строку из 100 символов b:
Изменить символ по индексу:
Длина строки:
Добавить символ в конец:
Удалить последний символ:
Склеивание строк:
Добавление символа через +:
Последние две операции обычно медленнее, так как создают копии строк. Для добавления одного символа лучше использовать push_back.
Методы substr, find, rfind
В C++ есть удобные методы для подстрок и поиска.
Метод substr извлекает подстроку заданной длины с заданного индекса:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s;
cin >> s;
cout << s.substr(3, 2) << endl;
return 0;
}
Для входа abcdefg результат: de.
Если второй параметр не указан, берётся суффикс до конца строки:
Для входа abcdefg результат: defg.
find возвращает индекс первого вхождения подстроки:
Для входа abcdqwerbcd результат: 1.
Если подстроки нет, возвращается специальное большое значение (string::npos). В учебных примерах часто приводят к int, тогда получится -1:
Для входа aaaaaaa результат: -1.
rfind ищет последнее (самое правое) вхождение:
Для входа abcdqwerbcd результат: 8.
Количество вхождений подстроки в строку
Задача: найти, сколько раз строка ss встречается как подстрока в строке s.
Решение (с пересечениями):
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s, ss;
getline(cin, s);
getline(cin, ss);
int cnt = 0;
int pos = s.find(ss);
while (pos != -1){
++cnt;
pos = s.find(ss, pos + 1);
}
cout << cnt << endl;
return 0;
}
Для s = aaaaa, ss = aa ответ будет 4 (пересекающиеся вхождения считаются).
Если нужны только непересекающиеся вхождения:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s, ss;
getline(cin, s);
getline(cin, ss);
int cnt = 0;
int pos = s.find(ss);
while (pos != -1){
++cnt;
pos = s.find(ss, pos + ss.length());
}
cout << cnt << endl;
return 0;
}
Разделение строки на слова
Задача: дана строка, нужно разделить её на слова.
Решение:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
string s;
getline(cin, s);
vector<string> words(1, "");
for (auto c: s){
if (c == ' '){
words.push_back("");
} else {
words.back().push_back(c);
}
}
for (auto word: words){
cout << word << endl;
}
return 0;
}
Если разделитель другой, меняем условие:
Если разделителей несколько:
Если вариантов разделителя много, удобно сначала заменить их все на пробелы, а затем уже разбивать строку на слова.
Функция getline и лексикографический порядок
Строки в C++ хранятся в типе string:
Если во входе Hello World!, то в s1 будет Hello, а в s2 — World!.
Для string нужно подключить библиотеку:
Часто удобнее читать строку целиком, включая пробелы:
Лексикографический порядок: сравнение идёт слева направо до первого различающегося символа. Меньше та строка, у которой код этого символа меньше. Если одна строка является началом другой, то меньшая — более короткая.
Примеры:
digit < dinosaur, потому чтоgидёт раньше, чемn.dig < digit, потому чтоdig— начало строкиdigit.
Сравнение строк
В C++ строки можно сравнивать лексикографически оператором <.
Программа, которая выводит меньшую из двух строк:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string a, b;
getline(cin, a);
getline(cin, b);
if (a < b){
cout << a;
} else {
cout << b;
}
return 0;
}
Извлечение цифр из строки
Задача: дана строка. Нужно выделить все цифры из строки.
Например, для строки 123aba23 45 результат: 1232345.
Решение:
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
int main()
{
string s, d = "";
getline(cin, s);
for (auto c: s){
if (isdigit(c)){
d.push_back(c);
}
}
cout << d;
return 0;
}
По материалам:
М. Густокашин. Введение в программирование на языке C++. Сириус Курсы. Перейти к курсу.
В Python строки имеют тип str.
Длина строки – len(s), символ по индексу – s[i]. Индексация начинается с 0.
Склейка строк – +, а для удобного формата часто используют f‑строки:
Сравнение по содержимому делается через ==:
Подстроки обычно берут срезом, а поиск делают через find:
Разбиение строки по пробелам:
Тип строки
Java: String
C++: std::string
Python: str
Сравнение по тексту
Java: s1.equals(s2) (без учёта регистра: equalsIgnoreCase)
C++: a == b
Python: a == b
Длина строки
Java: s.length()
C++: s.size() (или s.length())
Python: len(s)
Символ по индексу
Java: s.charAt(i) возвращает char
C++: s[i] возвращает char
Python: s[i] возвращает строку длины 1
Подстрока
Java: s.substring(l, r) – правая граница r не входит
C++: s.substr(l, len) – второй параметр это длина
Python: s[l:r] – правая граница r не входит
Склейка строк
Java: оператор +. Если склеек много, обычно используют StringBuilder.
C++: + и +=.
Python: +. Если склеек много, обычно собирают части и соединяют через ''.join(parts).
Чтение строки целиком
Java: Scanner.nextLine()
C++: getline(cin, line)
Python: input()