Вы находитесь на странице: 1из 6

Лекция 5.

Строки

Символ – элементарная единица, некоторый набор которых несет определенный


смысл. В языке программирования С++ предусмотрено использование символьных
констант. Символьная константа – это целочисленное значение (типа int) представленное
в виде символа, заключённого в одинарные кавычки, например 'a'. В таблице ASCII
представлены символы и их целочисленные значения.
// объявления символьной переменной
char symbol = 'a';
// где symbol – имя переменной типа char
// char – тип данных для хранения символов
Строки в С++ представляются как массивы элементов типа char, заканчивающиеся
нуль-терминатором \0 называются С строками или строками в стиле С.
\0 — символ нуль-терминатора.

Символьные строки состоят из набора символьных констант заключённых в


двойные кавычки. При объявлении строкового массива необходимо учитывать наличие в
конце строки нуль-терминатора, и отводить дополнительный байт под него.

// пример объявления строки


char string[10];
// где string – имя строковой переменной
// 10 – размер массива, то есть в данной строке может поместиться 9 символов ,
последнее место отводится под нуль-терминатор.
Строка при объявлении может быть инициализирована начальным значением,
например, так:
char string[10] = "abcdefghf";
Если подсчитать кол-во символов в двойных кавычках после символа равно их
окажется 9, а размер строки 10 символов, последнее место отводится под нуль–
терминатор, причём компилятор сам добавит его в конец строки.

// посимвольная инициализация строки:


char string[10] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'f', '\0'};
// десятый символ это нуль-терминатор.
При объявлении строки не обязательно указывать её размер, но при этом
обязательно нужно её инициализировать начальным значением. Тогда размер строки
определится автоматически и в конец строки добавится нуль-терминатор.

//инициализация строки без указания размера


char string[] = "abcdefghf";
//всё то же самое только размер не указываем.
Строка может содержать символы, цифры и специальные знаки. В С++ строки
заключаются в двойные кавычки. Имя строки является константным указателем на
первый символ. Разработаем программу, с использованием строк.

// symbols.cpp: определяет точку входа для консольного приложения.

#include "stdafx.h"
#include <iostream>
using namespace std;
2

int main(int argc, char* argv[])


{
char string[] = "this is string - "; // объявление и инициализация строки
cout << "Enter the string: ";
char in_string[500]; // строковый массив для ввода
gets(in_string); // функция gets() считывает все введённые символы с пробелами до
тех пор, пока не будет нажата клавиша Enter
cout << string << in_string << endl; // вывод строкового значения
system("pause");
return 0;
}
В строке 12 с помощью функции gets() считаются все введённые символы с
пробелами до тех пор, пока во вводимом потоке не встретится код клавиши enter. Если
использовать операцию cin то из всего введённого считается последовательность
символов до первого пробела

Таблица 1 — Функции для работы со строками и символами

Функция Пояснение

strlen(имя_строки) определяет длину указанной строки, без учёта нуль-символа

Копирование строк

strcpy(s1,s2) выполняет побайтное копирование символов из строки s2 в строку s1

strncpy(s1,s2, n) выполняет побайтное копирование n символов из строки s2 в строку s1.


возвращает значения s1

Конкатенация строк

strcat(s1,s2) объединяет строку s2 со строкой s1. Результат сохраняется в s1

strncat(s1,s2,n) объединяет n символов строки s2 со строкой s1. Результат сохраняется в s1

Сравнение строк

strcmp(s1,s2) сравнивает строку s1 со строкой s2 и возвращает результат типа int: 0 –


если строки эквивалентны, >0 – если s1<s2, <0 — если s1>s2 С учётом
регистра

strncmp(s1,s2,n) сравнивает n символов строки s1 со строкой s2 и возвращает результат


типа int: 0 –если строки эквивалентны, >0 – если s1<s2, <0 — если
s1>s2 С учётом регистра

stricmp(s1,s2) сравнивает строку s1 со строкой s2 и возвращает результат типа int: 0 –


если строки эквивалентны, >0 – если s1<s2, <0 — если s1>s2 Без учёта
регистра

strnicmp(s1,s2,n) сравнивает n символов строки s1 со строкой s2 и возвращает результат


типа int: 0 –если строки эквивалентны, >0 – если s1<s2, <0 — если
s1>s2 Без учёта регистра

Обработка символов
3

Таблица 1 — Функции для работы со строками и символами

Функция Пояснение

isalnum(c) возвращает значение true, если с является буквой или цифрой, и false в
других случаях

isalpha(c) возвращает значение true, если с является буквой, и false в других


случаях

isdigit(c) возвращает значение true, если с является цифрой, и false в других


случаях

islower(c) возвращает значение true, если с является буквой нижнего регистра,


и false в других случаях

isupper(c) возвращает значение true, если с является буквой верхнего регистра,


и false в других случаях

isspace(c) возвращает значение true, если с является пробелом, и false в других


случаях

toupper(c) если символ с, является символом нижнего регистра, то функция


возвращает преобразованный символ с в верхнем регистре, иначе символ
возвращается без изменений.

Функции поиска

strchr(s,c) поиск первого вхождения символа с в строке s. В случае удачного поиска


возвращает указатель на место первого вхождения символа с. Если символ
не найден, то возвращается ноль.

strcspn(s1,s2) определяет длину начального сегмента строки s1, содержащего те символы,


которые не входят в строку s2

strspn(s1,s2) возвращает длину начального сегмента строки s1, содержащего только те


символы, которые входят в строку s2

strprbk(s1,s2) Возвращает указатель первого вхождения любого символа строки s2 в


строке s1

Функции преобразования

atof(s1) преобразует строку s1 в тип double

atoi(s1) преобразует строку s1 в тип int

atol(s1) преобразует строку s1 в тип long int

Функции стандартной библиотеки ввода/вывода <stdio>

getchar(с) считывает символ с со стандартного потока ввода, возвращает символ в


формате int

gets(s) считывает поток символов со стандартного устройства ввода в строку s до


тех пор, пока не будет нажата клавиша ENTER
4

Если требуется ввести строку, состоящую из нескольких слов, в одну строковую


переменную, используют методы getline или get класса iostream, объектом которого является cin.
После имени объекта ставится точка, а затем пишется имя метода:
#include<iostream.h>
int main() {
const int n=8;
char s[n];
cin.getline(s,n);
cout << s << endl;
cin.get(s,n);
cout << s << endl;
return 0;
}

Метод getline считывает из входного потока n-1 символов или менее и записывает
их в строковую переменную s. Символ перевода строки также считывается (удаляется) из
входного потока, но не записывается в строковую переменную, вместо него размещается
завершающий 0. Метод get работает аналогично, но оставляет в потоке символ перевода
строки.
Не обращайтесь к методу get с двумя аргументами два раза подряд, не удалив \n из
входного потока. Возможное решение этой проблемы - вызов метода get без параметров
(cin.get()).
Более простое решение – использовать метод getline, который после прочтения
строки не оставляет во входном потоке символ \n.

Кроме того, в стандартной библиотеке С++ имеется файл <string>, подключение которого
позволяет использовать тип данных string. Ниже приведены несколько примеров:

Создание строк:
#include <string>
using namespace std;
string str1 = "Привет, мир!";
string str2("Это еще одна строка.");

Конкатенация строк:
string result = str1 + " " + str2;

Получение длины строки:


int length = result.length(); // или result.size();

Доступ к символам строки:


char firstChar = result[0];

Изменение строки:
result += " Добавим еще текст.";

Сравнение строк:
if (str1 == str2) {
// строки равны
} else {
// строки не равны
}
5

Функции работы со строками при использовании заголовочного файла string

1. length() и size()
#include <string>
using namespace std;
string str = "Привет, мир!";
int len = str.length(); // или str.size();
Функции length() и size() возвращают длину строки. Они эквивалентны и могут быть
использованы взаимозаменяемо.

2. append() и +=
string str1 = "Привет, ";
string str2 = "мир!";
str1.append(str2); // или str1 += str2;
Функции append() и += используются для конкатенации (добавления) одной строки к
другой.
3. substr(start, length)
string str = "Привет, мир!";
string substring = str.substr(0, 7); // "Привет"
Функция substr() извлекает подстроку из строки, начиная с указанной позиции (start) и
имеющей заданную длину (length).

4. find(substring)
string str = "Привет, мир!";
size_t position = str.find("мир"); // позиция первого вхождения подстроки
Функция find() возвращает позицию (индекс) первого вхождения подстроки в строке. Если
подстрока не найдена, возвращается string::npos.

5. replace(start, length, new_string)


string str = "Привет, мир!";
str.replace(7, 4, "дорогой"); // заменить "мир" на "дорогой"
Функция replace() заменяет часть строки, начиная с указанной позиции и имеющей
определенную длину, новой строкой.

6. compare()
string str1 = "Привет, мир!";
string str2 = "Привет, мир!";
int result = str1.compare(str2); // 0, если строки равны
Функция compare() сравнивает две строки. Возвращает 0, если строки равны. Возвращает
отрицательное число, если первая строка меньше второй, и положительное, если больше.

7. c_str()
string str = "Привет, мир!";
const char* cstr = str.c_str(); // преобразовать строку в символьный массив
Функция c_str() возвращает указатель на символьный массив, представляющий строку.

8. getline(cin, variable)
#include <iostream> using namespace std; string inputString; cout << "Введите строку: "; get-
line(cin, inputString); // чтение строки с пробелами
Функция getline() используется для чтения строки с пробелами из стандартного ввода.

9. empty()
string str = "Привет, мир!"; bool isEmpty = str.empty(); // false, если строка не пуста
6

Функция empty() возвращает true, если строка пуста, и false в противном случае.

10. erase(start, length)


string str = "Привет, мир!"; str.erase(7, 4); // удалить "мир" из строки
Функция erase() удаляет часть строки, начиная с указанной позиции и имеющей
определенную длину.

11. insert(position, string)


string str = "Привет!"; str.insert(6, " мир"); // вставить " мир" в строку после "Привет"
Функция insert() вставляет подстроку в строку на указанной позиции.

Эти функции обеспечивают широкие возможности для манипуляций со строками в C++. С


их помощью можно легко выполнять операции, такие как конкатенация, поиск, замена,
извлечение подстрок, сравнение и многое другое.

Основные моменты при работе со строками.


Длина динамической строки может быть переменной. Динамические строки нельзя
инициализировать при создании.
Длина нединамической строки должна быть константным выражением.
При задании длины строки необходимо учитывать завершающий нуль – символ.
Присваивание строк выполняется с помощью функций библиотеки.
Для консольного вывода строк используются либо объекты cin и cout, либо функции
библиотеки gets, scanf и puts, printf.
Ввод-вывод из файла может выполняться с помощью либо объектов классов ifstream и
ofstream, либо функций библиотеки fgets, fscanf и fputs, fprintf.
Ввод строки с помощью операции >> выполняется до первого пробельного символа. Для
ввода строки, содержащей пробелы, можно использовать либо методы getline или get класса
istream, либо функции библиотеки gets и scanf.
Смешивать в одной программе ввод-вывод с помощью потоковых классов и с помощью
функций библиотеки не рекомендуется.
Посимвольное чтение из файла неэффективно.
Разбивайте написание программы на последовательность шагов.
Выход за границы строки и отсутствие нуль - символа являются распространенными
причинами ошибок в программах.
Средства, представляемые языком, влияют на алгоритм решения задачи, и поэтому перед
тем, как продумывать алгоритм, необходимо эти средства изучить.
Программа, написанная с использованием функций, а не классов ввода-вывода, может
получиться более быстродействующей, но менее безопасной.
Недостатком С - строк по сравнению с классом string является отсутствие проверки выхода
строки за пределы отведенной ей памяти.

Вам также может понравиться