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 . |
Функции
Извлекает строки из входного потока, последовательно по одной строке.
// (1) delimiter as parameter template basic_istream& getline( basic_istream& in_stream, basic_string& str, CharType delimiter); template basic_istream& getline( basic_istream&& in_stream, basic_string& str, const CharType delimiter); // (2) default delimiter used template basic_istream& getline( basic_istream& in_stream, basic_string& str); template basic_istream& getline( basic_istream&& in_stream, basic_string& str);
Параметры
in_stream
Входной поток, из которого извлекается строка.
str
Строка, в которую считываются символы из входного потока.
delimiter
Разделитель строк.
Возвращаемое значение
Входной поток in_stream .
Замечания
Пара подписей функций, обозначенных как (1) , извлекает символы из in_stream до обнаружения delimiter и сохраняет их в str .
Пара подписей функций, помеченная (2) , использует новую строку в качестве разделителя строк по умолчанию и ведет себя как getline(in_stream, str, in_stream. widen(‘\n’)) .
Вторая функция каждой пары является аналогом первой для поддержки rvalue ссылок.
Извлечение останавливается при возникновении одного из следующих условий.
- В конце файла, в этом случае для внутреннего флага in_stream состояния задано значение ios_base::eofbit .
- После извлечения элемента, который сравнивается с delimiter . Элемент не возвращает или добавляется к управляемой последовательности.
- После извлечения str.max_size элементов функции. Для внутреннего флага in_stream состояния задано ios_base::failbit значение .
- Некоторые другие ошибки, отличные от перечисленных ранее; Для внутреннего флага in_stream состояния задано значение ios_base::badbit .
Дополнительные сведения о внутренних флагах состояния см. в разделе ios_base::iostate .
Если функция не извлекает никаких элементов, для внутреннего флага in_stream устанавливается значение ios_base::failbit . Во всех случаях getline возвращает in_stream .
При возникновении исключения in_stream и str остаются в допустимом состоянии.
Пример
Следующий код демонстрирует getline() в двух режимах: в первом с разделителем — символом новой строки (по умолчанию), во втором с разделителем — пробелом. Символ конца файла (CTRL-Z на клавиатуре) используется для управления завершением циклов while. Это значение задает для внутреннего флага cin eofbit состояния, который должен быть очищен до basic_ios::clear() второго во время правильной работы цикла.
// compile with: /EHsc /W4 #include #include #include using namespace std; int main() < string str; vectorv1; cout cout cin.clear(); vector v2; // Now try it with a whitespace delimiter while (getline(cin, str, ' ')) < v2.push_back(str); >cout >
stod
Преобразует последовательность символов в double .
double stod( const string& str, size_t* idx = 0); double stod( const wstring& str, size_t* idx = 0 ;
Параметры
str
Последовательность символов для преобразования.
idx
Значение индекса первого непреобразованного символа.
Возвращаемое значение
Значение типа double .
Замечания
Функция преобразует последовательность элементов в str значение типа double , как будто вызывая strtod( str.c_str(), _Eptr) , где _Eptr находится объект внутренний в функцию. Если str.c_str() == *_Eptr объект типа invalid_argument вызывается. Если такой вызов задает errno , то создается объект типа out_of_range . В противном случае, если idx не является пустым указателем, функция сохраняет *_Eptr — str.c_str() *idx и возвращает значение.
stof
Преобразует последовательность символов в число с плавающей запятой.
float stof( const string& str, size_t* idx = 0); float stof( const wstring& str, size_t* idx = 0);
Параметры
str
Последовательность символов для преобразования.
idx
Значение индекса первого непреобразованного символа.
Возвращаемое значение
Значение типа float .
Замечания
Функция преобразует последовательность элементов в str значение типа float , как будто вызывая strtof( str.c_str(), _Eptr) , где _Eptr находится объект внутренний в функцию. Если str.c_str() == *_Eptr объект типа invalid_argument вызывается. Если такой вызов задает errno , то создается объект типа out_of_range . В противном случае, если idx не является пустым указателем, функция сохраняет *_Eptr — str.c_str() *idx и возвращает значение.
stoi
Преобразует последовательность символов в целое число.
int stoi( const string& str, size_t* idx = 0, int base = 10); int stoi( const wstring& str, size_t* idx = 0, int base = 10);
Возвращаемое значение
Параметры
str
Последовательность символов для преобразования.
idx
Значение индекса первого непреобразованного символа.
base
Используемое числовое основание.
Замечания
Функция stoi преобразует последовательность символов в str в значение типа int и возвращает значение. Например, если передать последовательность символов «10», stoi возвращает целочисленное значение 10.
stoi выполняется аналогично функции для однобайтовых символов, когда он вызывается таким образом, где _Eptr является объектом внутренней функции strtol ; или wcstol для расширенных символов, когда он вызывается аналогичным образом wcstol(Str.c_str(), _Eptr, idx) . strtol( str.c_str(), _Eptr, idx) Дополнительные сведения см. в разделе strtol , wcstol , _strtol_l . _wcstol_l
Если str.c_str() == *_Eptr , stoi создает объект типа invalid_argument . Если такой вызов задается errno или если возвращаемое значение не может быть представлено как объект типа int , он создает объект типа out_of_range . В противном случае, если idx не является указателем NULL, функция хранится *_Eptr — str.c_str() в *idx .
stol
Преобразует последовательность символов в long .
long stol( const string& str, size_t* idx = 0, int base = 10); long stol( const wstring& str, size_t* idx = 0, int base = 10);
Параметры
str
Последовательность символов для преобразования.
idx
Значение индекса первого непреобразованного символа.
base
Используемое числовое основание.
Возвращаемое значение
Длинное целое значение.
Замечания
Функция преобразует последовательность элементов в str в значение типа long , как если бы вызывая strtol( str.c_str(), _Eptr, idx) , где _Eptr является объект внутренний в функцию. Если str.c_str() == *_Eptr объект типа invalid_argument вызывается. Если такой вызов задает errno , то создается объект типа out_of_range . В противном случае, если idx не является пустым указателем, функция сохраняет *_Eptr — str.c_str() *idx и возвращает значение.
stold
Преобразует последовательность символов в long double .
double stold( const string& str, size_t* idx = 0); double stold( const wstring& str, size_t* idx = 0);
Параметры
str
Последовательность символов для преобразования.
idx
Значение индекса первого непреобразованного символа.
Возвращаемое значение
Значение типа long double .
Замечания
Функция преобразует последовательность элементов в str в значение типа long double , как если бы вызывая strtold( str.c_str(), _Eptr) , где _Eptr является объект внутренний в функцию. Если str.c_str() == *_Eptr объект типа invalid_argument вызывается. Если такой вызов задает errno , то создается объект типа out_of_range . В противном случае, если idx не является пустым указателем, функция сохраняет *_Eptr — str.c_str() *idx и возвращает значение.
stoll
Преобразует последовательность символов в long long .
long long stoll( const string& str, size_t* idx = 0, int base = 10); long long stoll( const wstring& str, size_t* idx = 0, int base = 10);
Параметры
str
Последовательность символов для преобразования.
idx
Значение индекса первого непреобразованного символа.
base
Используемое числовое основание.
Возвращаемое значение
Значение типа long long .
Замечания
Функция преобразует последовательность элементов в str в значение типа long long , как если бы вызывая strtoll( str.c_str(), _Eptr, idx) , где _Eptr является объект внутренний в функцию. Если str.c_str() == *_Eptr объект типа invalid_argument вызывается. Если такой вызов задает errno , то создается объект типа out_of_range . В противном случае, если idx не является указателем NULL, функция сохраняет *_Eptr — str.c_str() *idx и возвращает значение.
stoul
Преобразует последовательность символов в длинное целое без знака.
unsigned long stoul( const string& str, size_t* idx = 0, int base = 10); unsigned long stoul( const wstring& str, size_t* idx = 0, int base = 10);
Параметры
str
Последовательность символов для преобразования.
idx
Значение индекса первого непреобразованного символа.
base
Используемое числовое основание.
Возвращаемое значение
Длинное целое значение без знака.
Замечания
Функция преобразует последовательность элементов в str в значение типа unsigned long , как если бы вызывая strtoul( str.c_str(), _Eptr, idx) , где _Eptr является объект внутренний в функцию. Если str.c_str() == *_Eptr объект типа invalid_argument вызывается. Если такой вызов задает errno , то создается объект типа out_of_range . В противном случае, если idx не является указателем NULL, функция сохраняет *_Eptr — str.c_str() *idx и возвращает значение.
stoull
Преобразует последовательность символов в unsigned long long .
unsigned long long stoull( const string& str, size_t* idx = 0, int base = 10); unsigned long long stoull( const wstring& str, size_t* idx = 0, int base = 10);
Параметры
str
Последовательность символов для преобразования.
idx
Значение индекса первого непреобразованного символа.
base
Используемое числовое основание.
Возвращаемое значение
Значение типа unsigned long long .
Замечания
Функция преобразует последовательность элементов в str в значение типа unsigned long long , как если бы вызывая strtoull( str.c_str(), _Eptr, idx) , где _Eptr является объект внутренний в функцию. Если str.c_str() == *_Eptr объект типа invalid_argument вызывается. Если такой вызов задает errno , то создается объект типа out_of_range . В противном случае, если idx не является пустым указателем, функция сохраняет *_Eptr — str.c_str() *idx и возвращает значение.
swap
Меняет местами массивы символов двух строк.
template void swap(basic_string& left, basic_string& right);
Параметры
left
Одна строка, элементы которой должны быть заменены элементами другой строки.
right
Другая строка, элементы которой будут заменены на элементы первой строки.
Замечания
Функция шаблона выполняет специализированную функцию-член left.swap ( right ) для строк, которая гарантирует постоянную сложность.
Пример
// string_swap.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; // Declaring an object of type basic_stringstring s1 ( "Tweedledee" ); string s2 ( "Tweedledum" ); cout
Before swapping string s1 and s2: The basic_string s1 = Tweedledee. The basic_string s2 = Tweedledum. After swapping string s1 and s2: The basic_string s1 = Tweedledum. The basic_string s2 = Tweedledee.
to_string
Преобразует значение в string .
string to_string(int value); string to_string(unsigned int value); string to_string(long value); string to_string(unsigned long value); string to_string(long long value); string to_string(unsigned long long value); string to_string(float value); string to_string(double value); string to_string(long double value);
Параметры
value
Преобразуемое значение.
Возвращаемое значение
Объект string , представляющий значение.
Замечания
Функция преобразует значение в последовательность элементов, хранящихся во внутреннем объекте Buf массива, в функцию, как при вызове sprintf(Buf, Fmt, value) , где Fmt находится
- "%d" Значение value типа int
- "%u" Значение value типа unsigned int
- "%ld" Значение value типа long
- "%lu" Значение value типа unsigned long
- "%lld" Значение value типа long long
- "%llu" Значение value типа unsigned long long
- "%f" Значение value типа float или double
- "%Lf" Значение value типа long double
Функция возвращает string(Buf) .
to_wstring
Преобразует значение в расширенную строку.
wstring to_wstring(int value); wstring to_wstring(unsigned int value); wstring to_wstring(long value); wstring to_wstring(unsigned long value); wstring to_wstring(long long value); wstring to_wstring(unsigned long long value); wstring to_wstring(float value); wstring to_wstring(double value); wstring to_wstring(long double value);
Параметры
value
Преобразуемое значение.
Возвращаемое значение
Расширенная строка, представляющая значение.
Замечания
Эта функция преобразовывает value в последовательность элементов, хранящихся в объекте массива Buf , размещенного внутри функции, как если бы выполнялся вызов swprintf(Buf, Len, Fmt, value) , где Fmt равняется
- L"%d" Значение value типа int
- L"%u" Значение value типа unsigned int
- L"%ld" Значение value типа long
- L"%lu" Значение value типа unsigned long
- L"%lld" Значение value типа long long
- L"%llu" Значение value типа unsigned long long
- L"%f" Значение value типа float или double
- L"%Lf" Значение value типа long double
Функция возвращает wstring(Buf) .
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 SmithБиблиотека обработки строк string.h
Здесь мы перечислим основные функции, предназначенные для работы со строками. Большинство прототипов этих функций (если не оговорено особо) находится в заголовочном файле string.h.
Строковые функции, в имени которых содержится дополнительная буква n, объявляют числовой параметр, ограничивающий некоторым образом действие функции. Эти функции безопаснее, но медленнее, чем их аналоги, не содержащие букву n. Программные примеры содержат следующие пары функций: strcpy() и strncpy(), strcat() и strncat(), strcmp() и strncmp().
int getchar(); - Возвращает значение символа(если он есть), который пользователь набрал на клавиатуре. После ввода символа нужно нажать клавишу Enter. Заголовочный файл - stdio.h
int getch(); - Аналогично предыдущему, только символ на экране не отображается. Используется чаще для организации задержки выполнения программы. Заголовочный файл - conio.h
int putchar(int c); - Выводит символ c на экран. В случае успеха возвращает сам символ c, в противном случе - EOF . Заголовочный файл - stdio.h
char *gets(char *s); - Читает символы, включая пробелы и табуляции, до тех пор, пока не встретится символ новой строки, который заменяется нулевым символом. Последовательность прочитанных символов запоминается в области памяти, адресуемой аргументом s. В случае успеха возвращает аргумент s, в случае ошибки - нуль. Заголовочный файл - stdio.h
int puts(const char *s); - Выводит строку, заданную аргументом const char *s. Заголовочный файл - stdio.h
char *strcpy (char *dst, const char *src); dst — указатель (Указатели в C++) на буфер назначения. src — указатель (Указатели в C++) на исходную строку. Копировать одну строку в другую. Аналогичная функция strncpy() ограничивает количество копируемых символов. Источник (source) и приемник (destination) являются указателями типа char * или символьными массивами.
char *strcat(char *dest, const char *scr); - Объединяет исходную строку scr и результирующую строку dest, присоединяя первую к последней. Возвращает dest.
char *strncat(char *dest, const char *scr, int maxlen); - Объединяет maxlen символов исходной строки scr и результирующую строку dest, присоединяя часть первой к последней. Возвращает dest.
char *strchr(const char *s, int c); - Ищет в строке s первое вхождение символа c, начиная с начала строки. В случае успеха возвращает указатель на найденный символ, иначе возвращает нуль.
char *strrchr(const char *s, int c); - Аналогично предыдущему, только поиск осуществляется с конца строки.
int strcmp(const char *s1, const char *s2); - Сравнивает две строки. Возвращает отрицательное значение, если s1
s2. Параметры - указатели на сравниваемые строки. int stricmp(const char *s1, const char *s2); - Аналогично предыдущему, только сравнение осуществляется без учета регистра символов.
int strncmp(const char *s1, const char *s2, int maxlen); - Аналогично предыдущему, только сравниваются первые maxlen символов.
int strnicmp(const char *s1, const char *s2, int maxlen); - Аналогично предыдущему, только сравниваются первые maxlen символов без учета регистра.
int strcspn(const char *s1, const char *s2); - Возвращает длину максимальной начальной подстроки строки s1, не содержащей символов из второй строки s2.
int strlen(const char *s); - Возвращает длину строки s - количество символов, предшествующих нулевому символу. wcslen использовать для wchar_t (юникода).
char *strlwr(char *s); - Преобразует все прописные (большие) буквы в строчные (малые) в строке s.
char *strupr(char *s); - Преобразует все строчные (малые) буквы в прописные (большие) в строке s.char *strnset(char *s, int c, int n); - Заполняет строку s символами c. Параметр n задает количество размещаемых символов в строке.
char *strpbrk(const char *s1, const char *s2); - Ищет в строке s1 первое вхождение любого символа из строки s2. Возвращает указатель на первый найденный символ или нуль - если символ не найден.
char *strrev(char *s); - Изменяет порядок следования символов в строке на обратный (кроме завершающего нулевого символа). Функция возвращает строку s.
char *strset(char *s, int c); - Заменяет все символы строки s заданным символом c.
int strspn(const char *s1, const char *s2); - Вычисляет длину максимальной начальной подстроки строки s1, содержащей только символы из строки s2.
char *strstr(const char *s1, const char *s2); - Ищет в строке s1 строку s2. Возвращает адрес первого символа вхождения строки s2. Если строка отсутствует - возвращает нуль.
char *strtok(char *s1, const char *s2); - Делит исходную строку s1 на лексемы (подстроки), разделенные одним или несколькими символами из строки s2.
#include #include #include using namespace std; int main() { char str[] = "dfaghs8da111adf56756wa7ghedh"; char delim[] = "a87";//что мы считаем разделителями в строке char *word = NULL; word = strtok(str,delim);// первый раз вызываем с явным указанием строки, //для дальнейшего поиска в заданной строке пишем NULL while (word = strtok(NULL,delim)) coutwordendl; } $ ./tststrtok ghs d 111 df56 56w ghedhdouble atof(const char *s); - Преобразует строку s в число с плавающей точкой типа double. Заголовочный файл - math.h
int atoi(const char *s); - Преобразует строку s в число типа int. Возвращает значение или нуль, если строку преобразовать нельзя. Заголовочный файл - stdlib.h
long atol(const char *s); - Преобразует строку s в число типа long. Возвращает значение или нуль, если строку преобразовать нельзя. Заголовочный файл - stdlib.h
char *itoa(int value, char *s, int radix); - Преобразует значение целого типа value в строку s. Возвращает указатель на результирующую строку. Значение radix - основание системы счисления, используемое при преобразовании (от 2 до 36). Заголовочный файл - stdlib.h
#include #include using namespace std; void main() { char *w2itoa = NULL; char s11[200]; //выделяем память под строку w2itoa = itoa(43534, s11, 16); coutw2itoa"\n"; }Конкатенация строк
Конкатенация двух строк означает их сцепление, при этом создается новая, более длинная строка. При объявлении строки
char original[128] = "Test ";strcat(original, " one, two, three!");превратит значение первоначальной строки original в "Test one, two, three!"
При вызове функции strcat() убедитесь, что первый аргумент типа char * инициализирован и имеет достаточно места, чтобы запомнить результат. Если c1 адресует строку, которая уже заполнена, а c2 адресует ненулевую строку, оператор strcat(c1, c2); перезапишет конец строки, вызвав серьезную ошибку.
Функция strcat() возвращает адрес результирующей строки (совпадающий с ее первым параметром) и может использоваться как каскад нескольких вызовов функций:
strcat(strcat(c1,c2),c3)Следующий пример показывает, как можно использовать функцию strcat() для получения в одной строке фамилии, имени и отчества, хранящихся отдельно, например, в виде полей базы данных. Введите фамилию, имя и отчество. Программа сцепит введенные вами строки и отобразит их как отдельную строку.
#include #include using namespace std; void main() { //Резервирование места для ввода трех строк. char *fam = new char[128]; char *im = new char[128]; char *otch = new char[128]; //Ввод данных. cout "Enter" "\n"; cout "\tSurname: "; cin >> fam; cout "\tName: "; cin >> im; cout "\tLastname: "; cin >> otch; //Резервирование места для результата. //Нужно учесть два пробела и результирующий //нулевой символ. char *rez=new char[strlen(fam)+strlen(im)+strlen(otch)+3]; //"Сборка" результата. strcat(strcat(strcpy(rez,fam)," "),im); strcat(strcat(rez," "),otch); //Возврат памяти в кучу. delete [] fam; delete [] im; delete [] otch; //Вывод результата. cout "\nResult: " rez; delete [] rez; }Приведенная программа демонстрируют важный принцип конкатенации строк: всегда инициализируйте первый строковый аргумент. В данном случае символьный массив rez инициализируется вызовом функции strcpy(), которая вставляет fam в rez. После этого программа добавляет пробелы и две другие строки - im и otch. Никогда не вызывайте функцию strcat() с неинициализированным первым аргументом.
Если вы не уверены в том, что в строке достаточно места для присоединяемых подстрок, вызовите функцию strncat(), которая аналогична функции strcat(), но требует числового аргумента, определяющего число копируемых символов. Для строк s1 и s2, которые могут быть либо указателями типа char *, либо символьными массивами, оператор
strncat(s1, s2, 4);присоединяет максимум четыре символа из s2 в конец строки s1. Результат обязательно завершается нулевым символом.
Существует один способ использования функции strncat(), гарантирующий безопасную конкатенацию. Он состоит в передаче функции strncat() размера свободной памяти строки-приемника в качестве третьего аргумента. Рассмотрим следующие объявления:
const int MAXLEN=128 char s1[MAXLEN] = "Cat"; char s2[] = "in hat";Вы можете присоединить s2 к s1, формируя строку "Cat in hat", с помощью функции strcat():
strcat(s1, s2);Если вы не уверены, что в s1 достаточно места, чтобы запомнить результат, используйте альтернативный оператор:
strncat(s1, s2, (MAXLEN-1)-strlen(s1));Этот способ гарантирует, что s1 не переполнится, даже если s2 нужно будет урезать до подходящего размера. Этот оператор прекрасно работает, если s1 - нулевая строка.
Часто программам приходится выполнять поиск в строках отдельных символов или подстрок, особенно при проверке имен файлов на заданное расширение. Например, после того как пользователю предложили ввести имя файла, проверяется, ввел ли он расширение .ТХТ, и если это так, то выполняется действие, отличное от того, какое было бы выполнено для расширения .ЕХЕ.
Возможно, вы также захотите отвергнуть все расширения, кроме определенного, что поможет вам предотвратить ошибки, вызванные загрузкой файла данных нежелаемого типа.
Поиск символов
Пример использования функции strchr().
#include #include #include using namespace std; void main() { char *filename = new char[128]; cout "Enter name of file: "; gets(filename); cout "\nName of file: " filename "\n"; if (strchr (filename,'.')) cout "Name has extension" "\n"; else strcat (filename,".TXT"); cout "Name of file: " filename "\n"; delete [] filename; }Данная программа находит расширение в имени файла, выполняя поиск точки среди символов введенной строки. (В имени файла может быть только одна точка, которая должна предшествовать расширению, если оно имеется.) Ключевым в этой программе является оператор
if (strchr (filename,'.')) cout
Выражение strchr (filename,'.') возвращает указатель на символ точки в строке, адресуемой указателем filename. Если такой символ не найден, функция strchr() возвращает нуль. Поскольку ненулевые значения означают "истину", вы можете использовать функцию strchr() в качестве возвращающей значение "истина"/"ложь". Вы также можете применить функцию strchr() для присваивания указателя на подстроку, начинающуюся с заданного символа. Например, если р - указатель, объявленный как char *, и указатель filename адресует строку TEST.ТХТ, то результат действия оператора p=strchr(filename, '.'); показан на рисунке
Рисунок демонстрирует еще один важный момент, связанный с адресацией указателем не полной строки, а ее части - подстроки. Такими указателями следует пользоваться с большой осторожностью. На рисунке показана только одна строка, TEST.ТХТ, оканчивающаяся нулевым байтом, но два указателя - filename и p. Указатель filename адресует полную строку. А указатель p адресует подстроку внутри того же набора символов. Строковые функции не заботятся о байтах, которые предшествуют их первому символу. Поэтому оператор
puts(p);отображает подстроку .ТХТ так, будто она полная строковая переменная, а не часть другой строки.
В программировании на C нет ничего необычного в использовании многих указателей, адресующих подстроки одной и той же полной строки. Но строка, показанная на рисунке, расположена в куче, поэтому оператор
delete [] p;пытаясь тем самым освободить подстроку, адресуемую указателем p, что, несомненно, приведет к разрушению кучи, вызвав ошибку, относящуюся к разряду трудно обнаруживаемых.
Функция strchr() отыскивает первое появление символа в строке. Объявления и операторы
char *p; char s[]="Abracadabra"; p = strchr(s,'a');присваивают указателю p адрес первой строчной буквы 'а' в строке "Abracadabra".
Функция strchr() рассматривает завершающий нуль строки как значащий символ. Приняв во внимание этот факт, можно узнать адрес конца строки. Учитывая предыдущие объявления, оператор
p = strchr(s,0);установит указатель p равным адресу подстроки "bra" в конце строки "Abracadabra".
Поиск подстрок
Кроме поиска символов в строке, вы также можете поохотиться и за подстроками. Этот пример демонстрирует этот метод. Данная программа аналогична предыдущей, но устанавливает расширение файла .ТХТ.
#include #include #include using namespace std; void main() { char *filename = new char[128],*p; cout "Enter name of file: "; gets(filename); cout "\nName of file: " filename "\n"; strupr(filename); p = strstr (filename,".TXT"); if (p) cout "Name has extension" "\n"; else { p = strchr (filename,'.'); if (p) *p=NULL; //Удалить любое другое расширение. strcat (filename,".TXT"); } cout "Name of file: " filename "\n"; delete [] filename; }Эта программа создает имя файла, которое обязательно заканчивается расширением .ТХТ. Чтобы определить, есть ли в имени файла это расширение, программа выполняет оператор
p = strstr (filename,".TXT");Подобно strchr(), функция strstr() возвращает адрес подстроки или нуль, если искомая строка не найдена. Если же цель будет обнаружена, указатель p установится равным ее адресу, в данном примере - адресу точки в подстроке .ТХТ. Поскольку расширение может быть введено и строчными буквами, программа выполняет оператор
strupr(filename);чтобы перед вызовом функции strstr() преобразовать буквы оригинальной строки в прописные.
Пример также демонстрирует способ усечения строки в позиции заданного символа или подстроки. Здесь вызывается функция strstr(), чтобы установить указатель p равным адресу первой точки в строке filename. Если результат этого поиска не нулевой, то выполнится оператор, который запишет вместо точки нулевой байт:
*p = NULL;Тем самым будет присоединен новый конец строки в том месте, где раньше находилось расширение файла. Теперь строка готова к добавлению нового расширения путем вызова функции strcat().
Копирование строк
Оператор присваивания для строк не определен. Если с1 и с2 - символьные массивы, вы не сможете скопировать один в другой следующим образом:
с1 = с2; //.Но если с1 и с2 объявить как указатели типа char *, компилятор согласится с этим оператором, но вряд ли вы получите ожидаемый результат. Вместо копирования символов из одной строки в другую оператор с1 = с2 скопирует указатель с2 в указатель с1, перезаписав, таким образом, адрес в с1, потенциально потеряв информацию, адресуемую указателем.
Чтобы скопировать одну строку в другую, вместо использования оператора присваивания вызовите функцию копирования строк strcpy(). Для двух указателей с1 и с2 типа char * оператор
strcpy(с1, с2);копирует символы, адресуемые указателем с2, в память, адресуемую указателем с1, включая завершающие нули. И только на вас лежит ответственность за то, что принимающая строка будет иметь достаточно места для хранения копии.
Аналогичная функция strncpy() ограничивает количество копируемых символов. Если источник (source) и приемник (destination) являются указателями типа char * или символьными массивами, то оператор
strncpy(destination, source, 10);скопирует до 10 символов из строки, адресуемой указателем source, в область памяти, адресуемую указателем destination. Если строка source имеет больше 10 символов, то результат усекается. Если же меньше - неиспользуемые байты результата устанавливаются равными нулю.
