Include string c что это

от admin

When do I use '#include <string>' at the start of a C++ program?

I am confused about the use of #include <string> at the start of a program. For example, in the code below, I don’t use #include <string> but the function will still print out the string «Johnny’s favorite number is» when it is run.

However, in this code below, it does contain #include <string> .

Do I only use #include <string> if a variable represents a string?

4 Answers 4

Do I only use #include <string> if a variable represents a string?

Use #include <string> when you use a variable that has type std::string .

The code «text here» , contrary to intuition, is not a std::string ; it is a string literal, and a C-style string, and a const char[10] convertible to const char* . Welcome to C++ with its legacy oddities.

Lightness Races in Orbit's user avatar

Your question arises from the fact that you know that something like «aabcd» is a string literal. So, its type should be string . Well, that’s not quite true.

C++ has a lot of features from C. Including data types. So, that is a pointer to char ( char* ), not a string (an instance of the string class). You can create an instance of the string class from a char* (including a string literal) by passing it as argument to the constructor of string . But it is not a string, it’s just some misleading terminology.

A similar case is calling things vectors when they are arrays.

If you use the type std::string in your code then you should include the <string> header. There are also a few other types and functions in that header, but std::string is the most commonly used one.

However, you do not need to include this header just to use string literals, which are built into the core language.

4.12 – Знакомство с std::string

Самая первая написанная вами программа на C++, вероятно, выглядела примерно так:

Так что точно такое " Hello, world! "? " Hello, world! " представляет собой набор последовательных символов, называемый строкой. В C++ мы используем строки для представления текста, такого как имена, адреса, слова и предложения. Строковые литералы (например, " Hello, world!\n ") помещаются в двойные кавычки, чтобы идентифицировать их как строки.

Поскольку в программах строки обычно используются, большинство современных языков программирования включают в себя базовый строковый тип данных. В C++ строки не являются базовым типом (на самом деле они являются составным типом и определены в стандартной библиотеке C++, а не как часть ядра языка). Но строки достаточно просты и полезны, поэтому мы представим их здесь, а не будем дожидаться главы о составных типах (глава 8).

std::string

Чтобы использовать строки в C++, нам сначала нужно включить через #include заголовочный файл <string> , чтобы ввести объявления для std::string . Как только это будет сделано, мы сможем определить переменные типа std::string .

Вы можете инициализировать или присваивать значения строкам, как и обычным переменным, что и следовало ожидать:

Обратите внимание, что строки также могут содержать числа:

В строковой форме числа обрабатываются как текст, а не как числа, и поэтому ими нельзя манипулировать как числами (например, вы не можете их умножать). C++ не будет автоматически преобразовывать строковые числа в целочисленные значения или значения с плавающей запятой.

Вывод строк

Строки можно выводить, как и ожидалось, с помощью std::cout :

Эта программа печатает:

Пустые строки ничего не напечатают:

Эта программа напечатает:

Ввод строк с помощью std::cin

Использование строк с std::cin может преподнести сюрпризы! Рассмотрим следующий пример:

Ниже показаны результаты пробного запуска этой программы:

Хммм, это неправильно! Что случилось? Оказывается, что при использовании operator>> для извлечения из cin строки operator>> возвращает только символы до первого попавшегося пробела. Все остальные символы остаются внутри std::cin в ожидании следующего извлечения.

Поэтому, когда мы использовали operator>> для извлечения строки в переменную name , было извлечено только " John ", оставив " Doe " внутри std::cin . Когда мы снова использовали operator>> для получения переменной age , он извлек " Doe " вместо того, чтобы ждать, пока мы введем возраст. На этом программа заканчивается.

Для ввода текста используйте std::getline()

Чтобы прочитать всю строку входных данных в переменную строки, лучше вместо этого использовать функцию std::getline() . std::getline() принимает два параметра: первый – это std::cin , а второй – ваша строковая переменная.

Вот та же программа, что и выше, с использованием std::getline() :

Теперь наша программа работает как и ожидалось:

Что еще за std::ws ?

В уроке «4.8 – Числовые типы с плавающей точкой» мы обсудили манипуляторы вывода, которые позволяют нам изменять способ отображения выводимых значений. В том уроке мы использовали функцию манипулятора вывода std::setprecision() , чтобы изменить количество значащих цифр, отображаемых std::cout .

C++ также поддерживает манипуляторы ввода (определенные в заголовке iomanip ), которые изменяют способ приема входных данных. Манипулятор ввода std::ws говорит std::cin игнорировать любые начальные пробелы. Обратите внимание, что std::ws не является функцией.

Давайте разберемся, чем он полезен. Рассмотрим следующую программу:

Вот пример результата работы этой программы:

Данная программа сначала просит вас ввести 1 или 2 и ждет, когда вы это сделаете. Пока всё хорошо. Затем она просит вас ввести свое имя. Однако на самом деле она не будет ждать, пока вы введете свое имя! Вместо этого она печатает строку " Hello ", а затем завершит работу. Что случилось?

Оказывается, когда вы вводите значение с помощью operator>> , std::cin не только захватывает значение, но также захватывает символ новой строки (' \n '), который появляется, когда вы нажимаете клавишу Enter . Итак, когда мы набираем 2 и нажимаем Enter , std::cin получает строку " 2\n ". Затем он извлекает 2 в переменную choice , оставляя символ новой строки на потом. Затем, когда std::getline() переходит к чтению имени, он видит, что " \n " уже находится в потоке, и полагает, что мы, должно быть, ввели пустую строку! Это определенно не то, что было задумано.

Мы можем изменить приведенную выше программу, чтобы использовать манипулятор ввода std::ws , чтобы указать std::getline() игнорировать любые начальные пробельные символы:

Теперь эта программа будет работать так, как задумано.

Лучшая практика

Если для чтения строк используется функция std::getline , используйте манипулятор ввода std::ws , чтобы игнорировать начальные пробелы.

Ключевые выводы

Использование оператора извлечения ( >> ) с std::cin игнорирует начальные пробелы.

std::getline не игнорирует начальные пробелы, если вы не используете манипулятор ввода std::ws .

Длина строки

Если мы хотим знать, сколько символов находится в std::string , мы можем спросить переменную std::string о ее длине. Синтаксис для этого отличается от того, что вы видели раньше, но он довольно прост:

Обратите внимание, что вместо того, чтобы запрашивать длину строки как length(myName) , мы говорим myName.length() . Функция length() не является обычной автономной функцией – это особый тип функции, которая принадлежит std::string и называется функцией-членом. Позже мы расскажем о функциях-членах, в том числе о том, как написать свои собственные.

Заключение

std::string сложен и использует многие языковые функции, которые мы еще не рассмотрели. К счастью, вам не нужно разбираться в этих сложностях, чтобы использовать std::string для простых задач, таких как простейший ввод и вывод строк. Мы рекомендуем вам начать экспериментировать со строками прямо сейчас, а дополнительные возможности строк мы рассмотрим позже.

Небольшой тест

Вопрос 1

Напишите программу, которая просит пользователя ввести свое полное имя и возраст. В качестве вывода сообщите пользователю, сколько лет он прожил для каждой буквы в своем имени (для простоты считайте пробелы как букву).

Читать:
Mailer daemon что это

Include string c что это

String in C programming is a sequence of characters terminated with a null character ‘\0’. Strings are defined as an array of characters. The difference between a character array and a string is the string is terminated with a unique character ‘\0’.

Example of C String:

C String Example
Declaration of Strings

Declaring a string is as simple as declaring a one-dimensional array. Below is the basic syntax for declaring a string.

In the above syntax str_name is any name given to the string variable and size is used to define the length of the string, i.e the number of characters strings will store.
Note: There is an extra terminating character which is the Null character (‘\0’) used to indicate the termination of a string that differs strings from normal character arrays. When a Sequence of characters enclosed in the double quotation marks is encountered by the compiler, a null character ‘\0’ is appended at the end of the string by default.

Initializing a String

A string can be initialized in different ways. We will explain this with the help of an example. Below are the examples to declare a string with the name str and initialize it with “GeeksforGeeks”.

4 Ways to Initialize a String in C

1. Assigning a string literal without size: String literals can be assigned without size. Here, the name of the string str acts as a pointer because it is an array.

2. Assigning a string literal with a predefined size: String literals can be assigned with a predefined size. But we should always account for one extra space which will be assigned to the null character. If we want to store a string of size n then we should always declare a string with a size equal to or greater than n+1.

3. Assigning character by character with size: We can also assign a string character by character. But we should remember to set the end character as ‘\0’ which is a null character.

4. Assigning character by character without size: We can assign character by character without size with the NULL character at the end. The size of the string is determined by the compiler automatically.

Below is the memory representation of the string “Geeks”.

Memory Representation of String in C

Let us now look at a sample program to get a clear understanding of declaring, initializing a string in C, and also how to print a string with its size.

Include string c что это

Стандартная библиотека языка С++ включает класс string , предназначенного для работы с массивом символов. Этот класс более безопасен в использовании, чем С-строка, функции для работы с которой также доступны.
В строках типа string завершающий символ не добавляется в массив, но может содержаться в массиве, как и любой другой символ. Инструментарий класса string более чем достаточен, чтобы не прибегать к работе со строкой в стиле Си. Вместе с тем, функции класса могут работать не только с экземплярами класса, но и с Cи-строкой. C-строки автоматически преобразуются в строки типа string .
Примечание. Хотя обратное преобразование и не производится, но существует возможность копировать символы в символьные массивы (с завершающим символом) используя функцию c_str() (или data() ).
В отличие от статического символьного C-массива, контейнер string представляет строку как динамический массив. Для работы с контейнером string стандартная библиотека предоставляет полный набор функций, общий для всех контейнеров, в частности, функции получения итераторов. Вся работа по распределению памяти выполняется классом string , а не разработчиком. Для начала работы с классом string необходимо подключить заголовочный файл директивой:

Инициализация объекта класса string

Объявление переменных типа string (на языке ООП — создание экземпляра класса) не отличается от объявления переменных других типов:

Примечание. Создается пустая строка myStr .
Инициализировать объекты класса string можно различными способами.

Ниже демонстрируется использование некоторых способов инициализации.
Программа 3

Примечание. Отдельным символом строку инициализировать нельзя!

Ввод и вывод объектов класса string. Функция getline

Для ввода/вывода строки используются глобальные потоковые объекты cin и cout и операции >> и << , соответственно. Если установлен флаг skipws начальные пробелы будут проигнорированы. В поток будут поступать символы, пока не будет встречен пробельный символ (к ним относятся следующие: собственно пробел, \t , \v , \r , \n и \f ) или EOF . В программе пробельный символ будет расцениваться как нулевое значение (т. е. конец строки) и в строковую переменную будет записана только часть строки, до первого пробела, остальная часть останется на очереди — в потоке. Такую строку получает переменная myStr в программе 4 (показано на выводе, стр. 11). Произвести сцепку оставшихся слов в потоке можно циклом while. (Смотрите ниже).
Программа 4

Чтобы ввести строку полностью, включая пробельные символы, необходимо использовать функцию getline() .
Примечание. Не путайте эту глобальную функцию класса string с функцией cin.getline() (методом класса istream ), которая обычно применяется для C-строки.
Синтаксис этой функции таков:

Аргументы функции:
is — потоковый объект ввода;
str — объект класса string , куда будет помещена строка;
char_delim — третий аргумент (необязательный) используется для указания завершающего символа. Если третьего аргумента нет, то предполагается, что завершающий символ — ‘\n’ .
Функция считывает строку полностью с завершающим символом. Сам символ новой строки отбрасывается и в строковой переменной не сохраняется. Также не добавляется нулевой символ. Символ новой строки завершает выполнение функции, где бы он не находился.
Если нулевой символ находится в начале строки, то функция вернет пустую строку. Рассмотрим этот случай:
Программа 5

После выполнения инструкции в строке 14: getline(cin, S2); и вывода C-строки программа выводит пустую строку и завершает свою работу. Причина того, что getline не приняла новую строку в том, что поток ввода оказался не пуст! После ввода С-строки ( ch ) в потоке остается завершающий символ (после выполнения операции ввода), этот символ и перехватила функция getline . Для очистки потока можно применить функцию cin.ignore() (или cin.get() ).

Конкатенация. Метод append()

В операции конкатенации (лат. concatenatio — «сцепле́ние») происходит объединение строк. Результатом сложения двух строк — является новая строка string. В этих операциях могут участвовать наряду с объектами класса string строковые литералы, одиночные символы и C-строки. Если объекту класса string осуществляется попытка присвоить значение конкатенации литералов (в конкатенации не участвуют объекты класса string ), то это приведет к ошибке. Для конкатенации применяются операции «+» и «+ +=» трактуется как «добавление в конец» строки. Например:

В результате выполнения первой инструкции в str3 будет записана вначале строка str1 , а затем строка str2 . (Значение, которое строка str3 имела до операции присваивания, будет утрачено). Результат второй инструкции: к символам строки str1 будут дописаны символы строки str3 . В третьей инструкции строке str2 будет передано значение строки str1 , дополненной литералом.

append()

Фактически операция «+ margin:0px;padding:0px;border:0px;font-family:Monaco,Consolas,Andale Mono,DejaVu Sans Mono,monospace;background-color:transparent»>append() . Однако, данный метод гибче, так как позволяет добавлять элементы различными способами, например:
1. подстроку из строки other_str в промежутке [pos, pos + count) :

2. подстроку определённую итераторами first и last :

3. или более лаконичное добавление count символов ch :

Дана непустая строка S и целое число N (> 0) . Вывести строку, содержащую символы строки S , между которыми вставлено по N символов ‘*’ .
Программа 6

Похожие статьи