BestProg
Содержание
Поиск на других ресурсах:
1. Какое назначение класса string в программах на C++?
2. Какие модули (библиотеки) нужно подключить, чтобы использовать возможности класса string в MS Visual Studio C++?
Объявление переменной типа string осуществляется точно так же как и обычной переменной. Возможный вариант объявления с одновременной инициализацией.
Класс string есть удобен тем, что позволяет удобно манипулировать строками, используя стандартные (перегруженные) операторы.
С объектами класса string можно использовать нижеследующие операторы
Пример, который демонстрирует использование вышеприведенных операторов
6. Содержит ли класс string конструкторы?
Как и любой класс, класс string имеет ряд конструкторов. Основные из них следующие:
7. Примеры инициализации с помощью конструкторов
Ниже приведены примеры инициализации переменных типа string
Чтобы присвоить одну строку другой, можно применить один из двух методов:
Функция assign() имеет несколько перегруженных реализаций.
Первый вариант – это вызов функции без параметров
В этом случае происходит простое присваивание одной строки другой.
Второй вариант позволяет копировать заданное количество символов из строки:
Третий вариант функции assign() копирует в вызывающий объект первые num символов строки s :
Пример.
Однако, функция append() хорошо подходит, если нужно добавлять часть строки.
Функция имеет следующие варианты реализации:
Первый вариант функции позволяет вставить полностью всю строку s в заданную позицию start вызывающей строки (вызывающего объекта):
В вышеприведенных функциях:
Функция replace() выполняет замену символов в вызывающей строке. Функция имеет следующие варианты реализации:
Для удаления символов из вызывающей строки используется функция erase() :
Пример.
В классе string поиск строки в подстроке можно делать двумя способами, которые отличаются направлением поиска:
Прототип функции find() имеет вид:
Прототип функции rfind() имеет вид:
Пример 1. Фрагмент кода, который демонстрирует результат работы функции find()
Прототип функции compare() :
Пример. Демонстрация работы функции compare() :
Пример 2.
Для определения количества символов в строке используется функция length() без параметров.
Include string c что это
В современном стандарте C++ определен класс с функциями и свойствами (переменными) для организации работы со строками (в классическом языке C строк как таковых нет, есть лишь массивы символов char ):
Для работы со строками также нужно подключить стандартный namespace :
Ниже приводится пример программы, работающей со string (в старых си-совместимых компиляторах не работает!):
Рассмотрим эти базовые возможности более подробно.
Инициализация строк при описании и длина строки (не включая завершающий нуль-терминатор):
Строка может быть задана и пустой:
Для проверки того, пуста ли строка, можно сравнить ее длину с 0:
Третья форма создания строки инициализирует объект типа string другим объектом того же типа:
Как скопировать одну строку в другую? С помощью обычной операции присваивания:
Для сцепления строк используется операция сложения ( + ) или операция сложения с присваиванием ( += ). Пусть даны две строки:
Мы можем получить третью строку, состоящую из конкатенации первых двух, таким образом:
Обратное преобразование при этом не работает. Попытка выполнить следующую инициализацию строки встроенного типа вызовет ошибку компиляции:
Чтобы осуществить такое преобразование, необходимо явно вызвать функцию-член с названием c_str() («строка Си»):
Функция c_str() возвращает указатель на символьный массив, содержащий строку объекта string в том виде, в каком она находилась бы во встроенном строковом типе. Ключевое слово const здесь предотвращает «опасную» в современных визуальных средах возможность непосредственной модификации содержимого объекта через указатель.
Но лучше читать документацию по C++ и пользоваться его возможностями. Например, предыдущее действие мы могли бы выполнить вызовом одной-единственной функции replace() :
Задание символов в строке
присваивает значения строке
назначает символы строке
Доступ к отдельным символам
получение указанного символа с проверкой выхода индекса за границы
получение указанного символа
получение первого символа
получение последнего символа
возвращает указатель на первый символ строки
Проверка на вместимость строки
проверяет, является ли строка пустой
возвращает количество символов в строке
возвращает максимальное количество символов
Функции обработки строк в Cи
В программе строки могут определяться следующим образом:
Кроме того, должно быть предусмотрено выделение памяти для хранения строки.
Под хранение строки выделяются последовательно идущие ячейки оперативной памяти. Таким образом, строка представляет собой массив символов. Для хранения кода каждого символа строки отводится 1 байт.
При определении массива символов необходимо сообщить компилятору требуемый размер памяти.
Компилятор также может самостоятельно определить размер массива символов, если инициализация массива задана при объявлении строковой константой:
В этом случае имена m2 и m3 являются указателями на первые элементы массивов:
При объявлении массива символов и инициализации его строковой константой можно явно указать размер массива, но указанный размер массива должен быть больше, чем размер инициализирующей строковой константы:
В этом случае объявление массива переменной m4 может быть присвоен адрес массива:
Для указателя можно использовать операцию увеличения (перемещения на следующий символ):
Массивы символьных строк
В этом случае poet является массивом, состоящим из четырех указателей на символьные строки. Каждая строка символов представляет собой символьный массив, поэтому имеется четыре указателя на массивы. Указатель poet[0] ссылается на первую строку:
*poet[0] эквивалентно ‘П’,
*poet[l] эквивалентно ‘-‘.
Инициализация выполняется по правилам, определенным для массивов.
Тексты в кавычках эквивалентны инициализации каждой строки в массиве. Запятая разделяет соседние
последовательности.
Кроме того, можно явно задавать размер строк символов, используя описание, подобное такому:
Разница заключается в том, что такая форма задает «прямоугольный» массив, в котором все строки имеют одинаковую длину.

Свободный массив
Операции со строками
Большинство операций языка Си, имеющих дело со строками, работает с указателями. Для размещения в оперативной памяти строки символов необходимо:
Для выделения памяти под хранение строки могут использоваться функции динамического выделения памяти. При этом необходимо учитывать требуемый размер строки:
Функции ввода строк
Для ввода строки, включая пробелы, используется функция
В качестве аргумента функции передается указатель на строку, в которую осуществляется ввод. Функция просит пользователя ввести строку, которую она помещает в массив, пока пользователь не нажмет Enter.
Функции вывода строк
Для вывода строк можно воспользоваться рассмотренной ранее функцией
или в сокращенном формате
Для вывода строк также может использоваться функция
которая печатает строку s и переводит курсор на новую строку (в отличие от printf() ). Функция puts() также может использоваться для вывода строковых констант, заключенных в кавычки.
Функция ввода символов
Для ввода символов может использоваться функция
которая возвращает значение символа, введенного с клавиатуры. Указанная функция использовалась в рассмотренных ранее примерах для задержки окна консоли после выполнения программы до нажатия клавиши.
Функция вывода символов
Для вывода символов может использоваться функция
которая возвращает значение выводимого символа и выводит на экран символ, переданный в качестве аргумента.
Пример Посчитать количество введенных символов во введенной строке.
Результат выполнения
Основные функции стандартной библиотеки string.h
Основные функции стандартной библиотеки string.h приведены в таблице.
Пример использования функций
Результат выполнения
Include string c что это
Как мы только что видели, применение встроенного строкового типа чревато ошибками и не очень удобно из-за того, что он реализован на слишком низком уровне. Поэтому достаточно распространена разработка собственного класса или классов для представления строкового типа – чуть ли не каждая компания, отдел или индивидуальный проект имели свою собственную реализацию строки. Да что говорить, в предыдущих двух изданиях этой книги мы делали то же самое! Это порождало проблемы совместимости и переносимости программ. Реализация стандартного класса string стандартной библиотекой С++ призвана была положить конец этому изобретению велосипедов.
Попробуем специфицировать минимальный набор операций, которыми должен обладать класс string:
Класс string стандартной библиотеки С++ реализует все перечисленные операции (и гораздо больше, как мы увидим в главе 6). В данном разделе мы научимся пользоваться основными операциями этого класса.
Для того чтобы использовать объекты класса string, необходимо включить соответствующий заголовочный файл:
Вот пример строки из предыдущего раздела, представленной объектом типа string и инициализированной строкой символов:
Длину строки возвращает функция-член size() (длина не включает завершающий нулевой символ).
Вторая форма определения строки задает пустую строку:
Как мы узнаем, пуста ли строка? Конечно, можно сравнить ее длину с 0:
Однако есть и специальный метод empty(), возвращающий true для пустой строки и false для непустой:
Третья форма конструктора инициализирует объект типа string другим объектом того же типа:
Строка st3 инициализируется строкой st. Как мы можем убедиться, что эти строки совпадают? Воспользуемся оператором сравнения (==):
Как скопировать одну строку в другую? С помощью обычной операции присваивания:
Для конкатенации строк используется операция сложения (+) или операция сложения с присваиванием (+=). Пусть даны две строки:
Мы можем получить третью строку, состоящую из конкатенации первых двух, таким образом:
Если же мы хотим добавить s2 в конец s1, мы должны написать:
Операция сложения может конкатенировать объекты класса string не только между собой, но и со строками встроенного типа. Можно переписать пример, приведенный выше, так, чтобы специальные символы и знаки препинания представлялись встроенным типом, а значимые слова – объектами класса string:
Подобные выражения работают потому, что компилятор знает, как автоматически преобразовывать объекты встроенного типа в объекты класса string. Возможно и простое присваивание встроенной строки объекту string:
Обратное преобразование, однако, не работает. Попытка выполнить следующую инициализацию строки встроенного типа вызовет ошибку компиляции:
Чтобы осуществить такое преобразование, необходимо явно вызвать функцию-член с несколько странным названием c_str():
Функция c_str() возвращает указатель на символьный массив, содержащий строку объекта string в том виде, в каком она находилась бы во встроенном строковом типе.
Приведенный выше пример инициализации указателя char *str все еще не совсем корректен. c_str() возвращает указатель на константный массив, чтобы предотвратить возможность непосредственной модификации содержимого объекта через этот указатель, имеющий тип
(В следующем разделе мы расскажем о ключевом слове const). Правильный вариант инициализации выглядит так:
К отдельным символам объекта типа string, как и встроенного типа, можно обращаться с помощью операции взятия индекса. Вот, например, фрагмент кода, заменяющего все точки символами подчеркивания:
Вот и все, что мы хотели сказать о классе string прямо сейчас. На самом деле, этот класс обладает еще многими интересными свойствами и возможностями. Скажем, предыдущий пример реализуется также вызовом одной-единственной функции replace():
replace() – один из обобщенных алгоритмов, с которыми мы познакомились в разделе 2.8 и которые будут детально разобраны в главе 12. Эта функция пробегает диапазон от begin() до end(), которые возвращают указатели на начало и конец строки, и заменяет элементы, равные третьему своему параметру, на четвертый.
Упражнение 3.12
Найдите ошибки в приведенных ниже операторах:
Упражнение 3.13
Объясните разницу в поведении следующих операторов цикла:
Упражнение 3.14
Даны две семантически эквивалентные программы. Первая использует встроенный строковый тип, вторая – класс string:
Что эти программы делают?
Оказывается, вторая реализация выполняется в два раза быстрее первой. Ожидали ли вы такого результата? Как вы его объясните?
Упражнение 3.15
Могли бы вы что-нибудь улучшить или дополнить в наборе операций класса string, приведенных в последнем разделе? Поясните свои предложения
Здравствуйте! А можно ли с помощью класса string добавить в строку после каждого символа пробел или нет? Заранее спасибо
а как сделать так чтобы введённый текст форматировался так: вводится максимальная длина строки, и если строка превышает это значение то не влезавшее слово и остальной текст перекидывает на след строку, и так далее форматирует?
4.12 – Знакомство с std::string
Самая первая написанная вами программа на C++, вероятно, выглядела примерно так:
Так что точно такое » Hello, world! «? » Hello, world! » представляет собой набор последовательных символов, называемый строкой. В C++ мы используем строки для представления текста, такого как имена, адреса, слова и предложения. Строковые литералы (например, » Hello, world!\n «) помещаются в двойные кавычки, чтобы идентифицировать их как строки.
Поскольку в программах строки обычно используются, большинство современных языков программирования включают в себя базовый строковый тип данных. В C++ строки не являются базовым типом (на самом деле они являются составным типом и определены в стандартной библиотеке C++, а не как часть ядра языка). Но строки достаточно просты и полезны, поэтому мы представим их здесь, а не будем дожидаться главы о составных типах (глава 8).
std::string
Вы можете инициализировать или присваивать значения строкам, как и обычным переменным, что и следовало ожидать:
Обратите внимание, что строки также могут содержать числа:
В строковой форме числа обрабатываются как текст, а не как числа, и поэтому ими нельзя манипулировать как числами (например, вы не можете их умножать). C++ не будет автоматически преобразовывать строковые числа в целочисленные значения или значения с плавающей запятой.
Вывод строк
Строки можно выводить, как и ожидалось, с помощью std::cout :
Эта программа печатает:
Пустые строки ничего не напечатают:
Эта программа напечатает:
Ввод строк с помощью std::cin
Использование строк с std::cin может преподнести сюрпризы! Рассмотрим следующий пример:
Ниже показаны результаты пробного запуска этой программы:
Хммм, это неправильно! Что случилось? Оказывается, что при использовании operator>> для извлечения из cin строки operator>> возвращает только символы до первого попавшегося пробела. Все остальные символы остаются внутри std::cin в ожидании следующего извлечения.
Для ввода текста используйте std::getline()
Вот та же программа, что и выше, с использованием std::getline() :
Теперь наша программа работает как и ожидалось:
C++ также поддерживает манипуляторы ввода (определенные в заголовке iomanip ), которые изменяют способ приема входных данных. Манипулятор ввода std::ws говорит std::cin игнорировать любые начальные пробелы. Обратите внимание, что std::ws не является функцией.
Давайте разберемся, чем он полезен. Рассмотрим следующую программу:
Вот пример результата работы этой программы:
Данная программа сначала просит вас ввести 1 или 2 и ждет, когда вы это сделаете. Пока всё хорошо. Затем она просит вас ввести свое имя. Однако на самом деле она не будет ждать, пока вы введете свое имя! Вместо этого она печатает строку » Hello «, а затем завершит работу. Что случилось?
Теперь эта программа будет работать так, как задумано.
Лучшая практика
Ключевые выводы
Использование оператора извлечения ( >> ) с std::cin игнорирует начальные пробелы.
Длина строки
Заключение
std::string сложен и использует многие языковые функции, которые мы еще не рассмотрели. К счастью, вам не нужно разбираться в этих сложностях, чтобы использовать std::string для простых задач, таких как простейший ввод и вывод строк. Мы рекомендуем вам начать экспериментировать со строками прямо сейчас, а дополнительные возможности строк мы рассмотрим позже.
Небольшой тест
Вопрос 1
Напишите программу, которая просит пользователя ввести свое полное имя и возраст. В качестве вывода сообщите пользователю, сколько лет он прожил для каждой буквы в своем имени (для простоты считайте пробелы как букву).





