Include string c что это
Определяет шаблон basic_string класса контейнера и различные вспомогательные шаблоны.
Дополнительные сведения о basic_string классе см. в разделе basic_string «Класс»
Синтаксис
#include
Замечания
Язык C++ и библиотека Standard C++ поддерживают два типа строк:
- Массивы символов, оканчивающиеся нулевым символов, часто называют строками C.
- Объекты шаблона класса, тип basic_string , обрабатывающие все char аргументы шаблона, такие как.
Определения типов
| Введите имя | Description |
|---|---|
| string | Тип, описывающий специализацию шаблона basic_string класса с элементами типа char в виде string . |
| wstring | Тип, описывающий специализацию шаблона basic_string класса с элементами типа wchar_t в виде wstring . |
| u16string | Тип, описывающий специализацию шаблона basic_string класса на основе элементов типа char16_t . |
| u32string | Тип, описывающий специализацию шаблона basic_string класса на основе элементов типа char32_t . |
Операторы
| Operator | Description |
|---|---|
| operator+ | Сцепляет два строковых объекта. |
| operator!= | Проверяет, что строковый объект слева от оператора не равен строковому объекту справа от оператора. |
| operator== | Проверяет, равен ли строковый объект слева от оператора строковому объекту справа от оператора. |
| operator< | Проверяет, что строковый объект слева от оператора меньше строкового объекта справа от оператора. |
| operator | Проверяет, что строковый объект слева от оператора меньше или равен строковому объекту справа от оператора. |
| operator | Функция шаблона, вставляющая строку в выходной поток. |
| operator> | Проверяет, что строковый объект слева от оператора больше строкового объекта справа от оператора. |
| operator>= | Проверяет, что строковый объект слева от оператора больше или равен строковому объекту справа от оператора. |
| operator>> | Функция шаблона, извлекающая строку из входного потока. |
Специализированные функции шаблонов
| Имя | Описание |
|---|---|
| hash | Создает хэш строки. |
| swap | Меняет местами массивы символов двух строк. |
| stod | Преобразует последовательность символов в double . |
| stof | Преобразует последовательность символов в float . |
| stoi | Преобразует последовательность символов в int . |
| stold | Преобразует последовательность символов в long double . |
| stoll | Преобразует последовательность символов в long long . |
| stoul | Преобразует последовательность символов в unsigned long . |
| stoull | Преобразует последовательность символов в unsigned long long . |
| to_string | Преобразует значение в string . |
| to_wstring | Преобразует значение в расширенную строку. |
Функции
| Function | Description |
|---|---|
| getline Шаблон | string Извлеките строку по строке из входного потока. |
Классы
| Класс | Description |
|---|---|
| basic_string Класса | Шаблон класса, описывающий объекты, которые могут хранить последовательность произвольных символьных объектов. |
| char_traits Структура | Шаблон класса, описывающий атрибуты, связанные с символом типа CharType |
Специализации
| Имя | Описание |
|---|---|
| char_traits Структура | Структура, которая является специализацией структуры char_traits шаблона для элемента типа char . |
| char_traits Структура | Структура, которая является специализацией структуры char_traits шаблона для элемента типа wchar_t . |
| char_traits Структура | Структура, которая является специализацией структуры char_traits шаблона для элемента типа char16_t . |
| char_traits Структура | Структура, которая является специализацией структуры char_traits шаблона для элемента типа char32_t . |
Include string c что это
Мы можем работать со строками в С++ в так называемом С-стиле как с массивами символов, которые оканчиваются на нулевой байт ‘0’. Однако, что если такой символ не будет найден или в процессе манипуляций со строкой будет удален, то дальшейшие действия с такой строкой могут иметь недетерминированный результат. По этой причине строки в С-стиле считаются небезопасными, и рекомендуется для хранения строк в C++ использовать тип std::string из модуля .
Объект типа string содержит последовательность символов типа char, которая может быть пустой. Например, определение пустой строки:
std::string message;
Также можно инициализировать или присвоить переменной string конкретную строку:
std::string message ; // или так std::string message2 = "Hello METANIT.COM!"; std::string message3("Hello METANIT.COM!");
В данном случае переменная message получит копию строкового литерала «Hello METANIT.COM!». В своем внутреннем представлении переменная message будет хранить массив символов, который также заканчивается на нулевой байт. Однако реализация типа string и предлагаемые им возможности делают работу с этим типом более безопасной.
И можно инициализировать объект string другим объектом string:
std::string hello; std::string message ; // message = "hello world" // или так // std::string message (hello); // std::string message = hello;
Мы можем вывести подобную строку на консоль:
#include #include int main() < std::string message ; std::cout
Получение и изменение символов строки
Подобно массиву мы можем обращаться с помощью индексов к отдельным символам строки, получать и изменять их:
std::string hello ; char c ; // e hello[0]='M'; std::coutПоскольку объект string представляет последовательность символов, то эту последовательность можно перебрать с помощью цикла for. Например, подсчитаем, сколько раз в строке встречается буква "l":
#include #include int main() < unsigned count<>; // счетчик, сколько раз встречается символ std::string message< "Hello World">; for(const char c: message) < if(c == 'l') < count++; >> std::coutЧтение строки с консоли
Для считывания введенной строки с консоли, как и для считывания других значений, можно использовать объект std::cin :
#include #include int main() < std::string name; std::cout > name; std::cout
Input your name: Tom Your name: TomОднако если при данном способе ввода строка будет содержать подстроки, разделенные пробелом, то std::cin будет использовать только первую подстроку:
Input your name: Tom Smith Your name: TomЧтобы считать всю строку, применяется метод getline() :
#include #include int main()
Метод getline принимает два объекта - std::cin и переменную, в которую надо считать строку.
Input your name: Tom Smith Your name: Tom SmithC++: Строки и std::string
"Hello, world!" — это набор последовательных символов, который называется строкой. В C++ мы используем строки для представления текста, такого как имена, адреса, слова и предложения.
В этом уроки мы познакомимся со строками в С++.
Особенность строк в С++
Строки в С++ не являются стандартным типом. Это составной тип, определенный в стандартной библиотеке, а не в ядре самого языка. Но строки достаточно просты и полезны, поэтому мы познакомимся с ними здесь, а в уроках про составные типы данных изучим их подробнее.
Чтобы использовать строки, нам нужно подключить заголовочный файл из стандартной библиотеки:
#include std::string domain < "code-basics" >;Тип string объявляется через пространство имен std . А строка в отличие от символа должна быть заключена в двойные кавычки.
Длина строки
Если мы хотим знать, сколько символов находится в std::string , мы можем спросить переменную std::string о ее длине. Синтаксис для этого отличается от того, что мы видели раньше:
#include #include int main() < std::string domain < "code-basics" >; std::coutВместо того, чтобы запрашивать длину строки как length(domain) , мы говорим domain.length() . Функция length() не является обычной автономной функцией. Это особый тип функции, которая принадлежит std::string и называется функцией-членом.
Позже мы расскажем о функциях-членах и о том, как написать собственные.
Эта программа создает следующий вывод:
Length domain name: 11У функции length() есть алиас size() , который работает идентично:
int main() < std::string domain < "code-basics" >; std::coutLength domain name: 11std::string сложен и использует многие языковые функции, которые мы еще не рассмотрели. Но нам не нужно разбираться в этих сложностях, чтобы использовать std::string для простых задач, таких как простейший ввод и вывод строк.
Мы рекомендуем начать экспериментировать со строками уже сейчас, а дополнительные возможности строк мы рассмотрим позже.
Задание
Допишите программу, которая принимает в качестве аргумента командной строки доменное имя, сохраните его в переменную типа std::string и выведите на экран количество символов этого имени. Получить аргумент командной строки можно таким образом: argv[1]
Упражнение не проходит проверку — что делать?
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
- Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.
В моей среде код работает, а здесь нет
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Мой код отличается от решения учителя
Это нормально , в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Прочитал урок — ничего не понятно
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Include string c что это
Стандартная библиотека языка С++ предоставляет программистам строковый тип данных (избавляет от использования массивов символов char[ ]).
Мы будем использовать тип данных string наряду со стандартными встроенными типами данных. И вы на первый взгляд не будете замечать никаких различий, хотя на самом деле это абстрактный тип данных, созданный на основе объектно-ориентированных возможностей языка С++. Надеюсь со временем вы тоже сможете создавать АТД, которыми можно будет пользоваться так же удобно и свободно, как и классом string.
Строковый тип данных позволяет хранить строки переменной длины, причем длину можно менять в процессе выполнения программы. Строковый тип представляет операторы, выполняющие такие операции над строками, как контеканация, присваивание, замещение и др.
Для того, чтобы можно было создавать строковую переменную, необходимо подключить описание этого типа данных из стандартной библиотеки.
void main()
string name="Vitaly"; // объявление, определение, инициализация
string lastname="Domnenko";
name+="M."+lastname; // конкатенация с присваиванием (накапливающее присваивание)
cout >
Используя [ ] можно получить символ из любой позиции
char ch=name[5]; // символы нумеруются с нуля
Лексикографическое сравнение осуществляется с использованием операторов == < >= !=. При лексикографическом сравнении последовательно сравниваются коды символов строки. Те символы считаются "больше", чьи коды "больше"и наоборот.
Кодировка (кодовая таблица) - это однозначное соответствие между целым число (кодом) и символом. При этом символ - это буква, цифра и другие графические знаки. Кодировки обычно составляют так, что символы следуют в алфавитном порядке и символ 'а' имеет наименьший код, а символ 'z' наибольший. Таким образом, выполняя лексикографическое сравнение можно разместить слова (строки) в алфавитном порядке. Это справедливо и для символов кириллического алфавита. Но не всегда, т.к. существует кодировки, в которой кириллические символы располагаются не в алфавитном порядке. Это кодировка КОИ8, которая обычно используется в операционных системах UNIX. Если вы пишете программу для UNIX, то нужно помнить, что простое лексикографическое сравнение не даст ожидаемого результата и нужно усложнять программу.
В нашем случае (при программировании для DOS или Windows) используются кодировки CP866 и СP1251 лексикографическое сравнение справедливо и дает нужный результат.
Ну и операторы для ввода/вывода строковых переменных >>
| Функция | Описание |
|---|---|
| Конструкторы | |
| string() | конструктор по умолчанию, создает пустую строку |
| string(const char* p) | преобразующий конструктор |
| string(const string& str, size t pos=0, size t n=npos) | копирующий конструктор (npos обычно равен -1 и указывает, что память не была выделена) |
| string(const char* p, size_t n) | копирует n символов, р является базовым адресом |
| string(char c, size t n=l) | создает строку из n символов с |
| Перегруженные операторы | |
| string& operator= (const string& s) | оператор присваивания |
| string& operator+= (const string& s) | добавляет строку |
| char operator[] (size t pos) const | возвращает символ из позиции pos |
| char& operator[] (size t pos) | возвращает ссылку на символ из позиции pos |
| Функции-члены | |
| string& append(const string& s, size_t pos=0, size t n=npos); | Добавляет n символов начиная от позиции pos |
| string& assign(const string& s, size_t pos=0, size_t n=npos); | строковому объекту присваивается n символов, начиная от позиции pos |
| string& insert(size_t posl, const string& str, size_t pos2=0 , size_t n=npos); | вставляет n символов, полученных из str, начиная с позиции pos2, в строку с позиции posl |
| string& remove(size_t pos=0 , size_t n=npos); | Удаляются n символов из строки начиная с позиции pos |
| string& replace(posl, nl, str, pos2=0, n2=npos); | в неявной строке начиная с позиции posl заменяет nl символов n2 символами из подстроки str с позиции pos2 |
| string& replace(pos, n, p, n2); | заменяет n символов в позиции pos используя char* p из n2 символов или char* p до завершающего нуля, или повторяя символ с rep раз |
| char get_at (pos) const; | возвращает символ из позиции pos |
| void put_at (pos, c); | помещает символ с в позицию pos |
| size_t length() const; | возвращает длину строки |
| const char* c_str() const; | преобразует строку в традиционное char* представление |
| const char* data() const; | возвращает базовый адрес строкового представления |
| void resize(n, c); void resize(n); | изменяет строку, делая ее длину равной п; в первой функции в качестве заполняющего символа выступает с, а во второй - символ eos () (end-of-string, конец строки) |
| void reserve(size_t res_arg);size_t reserve() const; | выделяет память под строку; первая функция переустанавливает this; вторая возвращает закрытый член res - размер выделенного фрагмента |
| size_t copy(p, n, pos=0) const; | п симолов строки, начиная с позиции pos, копируются в char* p |
| string substr(pos=0, n=pos) const; | возвращается подстрока из п символов строки |
| int compare(const string& str, size_t pos=0, size_t n=npos) const; | сравнивает п символов строки, начиная с позиции pos, со строкой str. Возвращается ноль, если строки равны; в противном случае возвращается положительное или отрицательное целое значение, показывающее, что неявная строка лексикографически больше или меньше чем строка str. |
| size_t find (const string& str, size_t pos=0) const; | в строке начиная с позиции pos производится поиск строки str. Если она найдена, возвращается позиция, в которой она начинается; в противном случае возвращается позиция npos |
| size_t rfind(str, pos=npos) const; | похоже на find (), но при поиске первого совпадения строка сканируется в обратном направлении |
| size_t find_first_of(str, pos=0) const; | производится поиск первого вхождения str начиная с позиции pos |
| size_t find_last_of(str, pos=npos) const; | аналогично, но в обратном направлении |
| size_t find_first_not_of(str, pos=0) const; | производится поиск первого символа, который не соответствует ни одному из символов str начиная с позиции pos |
| size_t find_last_not_of(str, pos=npos) const; | аналогично, но в обратном направлении |
Пример работы со строками
///////////////////////////////////////////////////////////////////////////// // Прикладное программирование // Пример 2.1. Пример работы со сроками // // Кафедра Прикладной и компьютерной оптики, http://aco.ifmo.ru // Университет ИТМО ///////////////////////////////////////////////////////////////////////////// #include // подключение библиотеки ввода-вывода #include // подключение библиотеки ввода-вывода в файл #include // подключение описания string using namespace std; // подключение стандартного пространства имен для использования библиотек ///////////////////////////////////////////////////////////////////////////// void main() < ifstream ifile("test.html"); // создание потока ввода из файла по его имени string data; // строка куда будут записаны данные // цикл будет выполняться до тех пор, пока не встретиться конец файла while(!ifile.eof()) < string sLine; getline(ifile, sLine, '\n'); // читаем строку из файла до символа конца строки data+=sLine; // записываем прочитанную строку в конец итоговой > size_t num_first=0; // номер символа, с которого будет происходить поиск // бесконечный цикл, выход из цикла - по оператору break while(true) < // находим номер символа, с которого начинается подстрока "// если такого текста не нашли - выход из цикла num_first=data.find("
, num_first); if(num_first==string::npos) break; // находим номер символа, с которого начинается подстрока ">", начиная с символа под номером num_first+1 // если такого текста не нашли - выход из цикла size_t num_last=data.find(">", num_first+1); if(num_last==string::npos) break; // выделяем подстроку от "" string image_data=data.substr(num_first+1, num_last-num_first-1); // запоминаем символ, начиная с которого будем искать в следующий раз num_first=num_last+1; // ищем номер символа, с которого начинается подстрока "src="" // (для задания подстроки используем экранирующий символ) size_t num_first2=image_data.find("src=\""); // если такая подстрока была найдена if(num_first2!=string::npos) < // ищем закрывающую кавычку size_t num_last2=image_data.find("\"", num_first2+6); // если такая подстрока была найдена - выделяем в отдельную строку имя файла и выводим на экран if(num_last2!=string::npos) < string image_name=image_data.substr(num_first2+5, num_last2-num_first2-5); cout> >; > /////////////////////////////////////////////////////////////////////////////