D предоставляет следующие два типа строковых представлений:
Мы можем представить массив символов в одной из двух форм, как показано ниже. В первой форме размер указан напрямую, а во второй форме используется метод dup, который создаёт перезаписываемую копию строки "Доброе утро".
char[21] greeting1 = "Всем привет"; char[] greeting2 = "Доброе утро".dup;
Вот простой пример, использующий приведённые выше простые формы массива символов.
import std.stdio; void main(string[] args) { char[21] greeting1 = "Всем привет"; writefln("%s", greeting1); char[] greeting2 = "Доброе утро".dup; writefln("%s", greeting2); }
Когда вы скомпилируете и выполните эту программу, она возвратит следующий результат:
Всем привет Доброе утро
Строки string встроены в язык D. Эти строки совместимы с массивом символов, показанным выше. В следующем примере показано простое объявление строки.
string greeting1 = "Hello all";
Насколько мне известно, это практически то же, что и массивы, только неизменяемые. Тип string является псевдонимом для выражения
immutable char[]
– прим. пер.
import std.stdio; void main(string[] args) { string greeting1 = "Всем привет"; writefln("%s", greeting1); char[] greeting2 = "Доброе утро".dup; writefln("%s", greeting2); string greeting3 = greeting1; writefln("%s", greeting3); }
Когда вы скомпилируете и выполните эту программу, она возвратит следующий результат:
Всем привет Доброе утро Всем привет
Для соединения строк в языке D используется символ тильды (~).
import std.stdio; void main(string[] args) { string greeting1 = "Доброе"; char[] greeting2 = "утро".dup; char[] greeting3 = greeting1~" "~greeting2; writefln("%s", greeting3); string greeting4 = "утро"; string greeting5 = greeting1~" "~greeting4; writefln("%s", greeting5); }
Когда вы скомпилируете и выполните эту программу, она возвратит следующий результат:
Доброе утро Доброе утро
Длину строки в байтах можно получить с помощью функции length.
import std.stdio; void main(string[] args) { string greeting1 = "Доброе"; writefln("Длина строки greeting1 равна %d", greeting1.length); char[] greeting2 = "утро".dup; writefln("Длина строки greeting2 равна %d", greeting2.length); }
Когда вы скомпилируете и выполните эту программу, она возвратит следующий результат:
Длина строки greeting1 равна 12 Длина строки greeting2 равна 8
Цифры или буквы латинского алфавита обычно занимают по одному байту. Буквы кириллицы в кодировке UTF-8 занимают по 2 байта. Существуют алфавиты, символы которых могут занимать ещё больше байт, например иероглифы некоторых китайских диалектов. – прим. пер.
В языке D сравнивать строки довольно просто. Для сравнения строк вы можете использовать операторы ==, <, и >.
import std.stdio; void main() { string s1 = "Привет"; string s2 = "Мир"; string s3 = "Мир"; if (s2 == s3) { writeln("s2: ",s2," и s3: ",s3, " – это одно и тоже!"); } if (s1 < s2) { writeln("'", s1, "' предшествует '", s2, "'."); } else { writeln("'", s2, "' предшествует '", s1, "'."); } }
Когда вы скомпилируете и выполните эту программу, она возвратит следующий результат:
s2: Мир и s3: Мир – это одно и тоже! 'Мир' предшествует 'Привет'.
Мы можем заменить часть строки, используя операцию среза string[].
import std.stdio; import std.string; void main() { char[] s1 = "привет, Земля ".dup; char[] s2 = "космос".dup; s1[14..26] = s2[0..12]; writeln(s1); }
Когда вы скомпилируете и выполните эту программу, она возвратит следующий результат:
привет, космос
Индексные методы для нахождения подстроки в строке, включают indexOf (поиск первого вхождения) и lastIndexOf (поиск последнего вхождения), и объясняются на следующем примере.
import std.stdio; import std.string; void main() { char[] s1 = "привет, Мир ".dup; writeln("indexOf подстроки вет внутри привет, Мир равен ", std.string.indexOf(s1, "вет")); writeln(s1); writeln("lastIndexOf подстроки И внутри привет, Мир равен " , std.string.lastIndexOf(s1, "И", CaseSensitive.no)); }
Когда вы скомпилируете и выполните эту программу, она возвратит следующий результат:
indexOf подстроки вет внутри привет, Мир равен 6 привет, Мир lastIndexOf подстроки И внутри привет, Мир равен 16
Методы, используемые для изменения регистров, показаны в следующем примере.
import std.stdio; import std.string; void main() { char[] s1 = "привет, Мир ".dup; writeln("Строка s1 с заглавной буквы равна ", capitalize(s1)); writeln("Строка s1 в верхнем регистре равна ", toUpper(s1)); writeln("Строка s1 в нижнем регистре равна ", toLower(s1)); }
Когда вы скомпилируете и выполните эту программу, она возвратит следующий результат:
Строка s1 с заглавной буквы равна Привет, мир Строка s1 в верхнем регистре равна ПРИВЕТ, МИР Строка s1 в нижнем регистре равна привет, мир
Ограничение по символам в строках показано в следующем примере.
import std.stdio; import std.string; void main() { string s = "П123Привет1"; string result = munch(s, "0123456789П"); writeln("Оставить только начальные символы: ", result); result = squeeze(s, "0123456789П"); writeln("Отсечь начальные символы: ", result); s = " Привет, Мир "; writeln("Избавиться от начальных и конечных пробелов: ", strip(s)); }
Когда вы скомпилируете и выполните эту программу, она возвратит следующий результат:
Оставить только начальные символы: П123П Отсечь начальные символы: ривет1 Избавиться от начальных и конечных пробелов: Привет, Мир
К сожалению, munch, squeeze и ещё несколько не показанных здесь функций из модуля std.string в 2017 году объявлены устаревшими, и в 2018 будут удалены из стандартной библиотеки. Вместо них предлагается использовать регулярные выражения. – прим. пер.