В предыдущих статьях, мы в основном обсуждали числовые массивы в C++. Но именно в этой статье мы обсудим манипуляции с символьными массивами, которые мы просто называем «Строки».
Массив символов в основном представляет собой строку в стиле C, которую поддерживает C++. Помимо символьных массивов в стиле C, C++ также поддерживает строковый класс «std::string». Далее мы обсудим какие бывают типы строк, и разницу между этими типами, а также представим программирование каждого типа на C++.
Массивы символов (строки в стиле C)
Строка в стиле C представляет собой массив символов, оканчивающийся нулевым символом «\0». Следовательно, мы можем определить массив типа char и размеры или размер массивов, а затем мы можем инициализировать его строкой или массивом символов.
Обратите внимание, что именно компилятор завершает строку нулевым символом, поэтому, если мы инициализируем массив символов строкой (в двойных кавычках «»), нам нужно оставить дополнительный пробел для нулевого символа при объявлении размера массива.
Давайте рассмотрим несколько примеров объявления и инициализации массивов символов:
1 2 3 |
char firstStr[] = "This is Cstyle string"; char secStr[100] = {'m','o','n','i','t','o','r','b','a','n','k','\0'}; char thirdStr[] = {'h','e','l','l','o','\0'}; |
Все приведенные выше определения являются допустимыми определениями строк в стиле C в C++. Обратите внимание, что мы можем либо объявить фактический размер, либо оставить его пустым, чтобы компилятор мог присвоить размер в зависимости от строки, которую мы инициализировали.
Давайте рассмотрим пример чтения и записи массива символов в C++.
Ниже приведена простая программа, которая читает строку с помощью cin и выводит ее с помощью cout:
1 2 3 4 5 6 7 8 9 |
#include <iostream> #include <string> using namespace std; int main() { char firstStr[100]; cin>>firstStr; cout<<"you entered : "<<firstStr; } |
Вывод данных 1:
monitorbank.ru, который вы ввели: monitorbank.ru
Вывод данных 2:
Вы ввели строку в стиле C
: This
Если мы сравним оба вывода, то увидим, что когда мы ввели первую строку «monitorbank.ru», она была напечатана как есть.
Но во втором выводе, хотя мы ввели строку как «This is Cstyle string» («Это строка в стиле C»), вывод был только «This» («Это»).
Разница в выводе заключается в том, что оператор cin ‘>>’, который используется для чтения строки, обрабатывается как функция ‘scanf’ языка C, которая читает только до тех пор, пока не встретится пробел. Следовательно, ‘cin with >>’ подходит для чтения массивов символов без пробела.
Чтобы прочитать всю строку символов, включая пробелы, C++ использует функцию «get».
Пример программы, использующей функцию get, показан ниже:
1 2 3 4 5 6 7 8 9 |
#include <iostream> #include <string> using namespace std; int main() { char firstStr[100]; cin.get(firstStr,100); cout<<"you entered : "<<firstStr; } |
Вывод данных:
monitorbank.ru, который вы ввели: monitorbank.ru
Как показано в примере, функция get cin использует два аргумента. Первый аргумент — это переменная массива символов, в которой должна быть прочитана строка, а второй аргумент — это максимальный размер массива.
Строки в стиле C также поддерживают многочисленные строковые функции, которые позволяют пользователям манипулировать строками. Эти функции определены в заголовке «cstring».
Ниже мы представляем таблицу, в которой перечислены различные строковые функции, которые можно использовать для управления строками в стиле C:
Номер | Функция | Аргументы | Описание |
---|---|---|---|
1 | strcpy | s1, s2 | Копирует строку s2 в строку s1 |
2 | strcat | s1,s2 | Добавляет или объединяет строку s2 в конец строки s1 |
3 | strlen | s1 | Возвращает длину строки s1 |
4 | strcmp | s1,s2 | Возвращает 0: s1 и s2 совпадают <0:s1 <s2 >0:s1>s2</s2 |
5 | strchr | s1,ch | Возвращает указатель на первое вхождение символа ch в строку s1 и строку оттуда. |
6 | strstr | s1,s2 | Возвращает первое вхождение строки s2 в строку s1. |
Следующая программа показывает использование некоторых из этих функций в C++:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include <iostream> #include <cstring> using namespace std; int main() { char firstStr[50] = "This is monitorbank.ru"; char secStr[50] = "a testing platform"; int len = strlen(firstStr); cout<<"Length of firstStr : "<<len; strcpy(secStr,"monitorbank"); cout<<"\nResultant string (secStr):"<<secStr; cout<<"\nComparing firstStr and secStr :"<<strcmp(firstStr,secStr); strcat(secStr," for you"); cout<<"\nConcatenated secStr: "<<secStr; cout<<"\nFirst occurence of i in firststr at:"<<strchr(firstStr,'T'); return 0; } |
Вывод данных:
1 2 3 4 5 |
Length of firstStr: 31 Resultant string (secStr):monitorbank Comparing firstStr and secStr :-31 Concatenated secStr: softwareTesting for you First occurrence of i in firststr at: s is monitorbank.ru |
Получается, что:
Длина firstStr: 14
Результирующая строка (secStr):monitorbank
Сравнение firstStr и secStr :-14
Конкатенация secStr: monitorbank for you
Первое вхождение i в firststr at: s — monitorbank.ru
Строковый класс в С++
Строка в C++, определяемая классом «std::string», является представлением потока символов в объект. Другими словами, класс String представляет собой набор строковых объектов. Этот строковый класс является частью пространства имен std и определен в заголовке «string.h».
Давайте обсудим некоторые основные различия между строковым классом и символьным массивом.
В то время как массивы символов, которые мы обсуждали выше, распределяются статически во время компиляции, строки являются объектами и, следовательно, могут выделяться динамически.
Поскольку массивы символов являются статическими по своей природе, их нельзя уменьшить или расширить после определения. Следовательно, если у нас есть массив символов размером 100, и мы инициализировали его словом «Hello», то оставшееся пространство тратится впустую.
Char mystr[100] = «Hello»;
Здесь оставшиеся 95 локаций потрачены впустую.
В отличие от этого, строковые объекты являются динамическими по своей природе и занимают ровно столько места, сколько занимает значение.
- Массивы символов быстрее по производительности, тогда как строки медленнее.
- Массивы символов имеют несколько функций, работающих с ними, которые могут ими управлять.
Класс String имеет множество функций, включая функции итератора.
Вот некоторые из основных различий между массивом символов и классом строковых объектов.
Далее вы увидите несколько примеров строкового класса вместе с некоторыми основными операциями, которые выполняются над объектами строкового класса.
Пример объявления и инициализации строкового класса:
1 2 3 4 5 6 7 8 9 |
#include <iostream> #include <string> using namespace std; int main() { string str="This is string object in C++"; cout<<"\nString entered is :"<<str; return 0; } |
В приведенном выше примере мы объявили и инициализировали строковый объект с помощью класса «string». Это простой пример. Теперь давайте создадим программу для чтения строки от пользователя, а также продемонстрируем несколько строковых функций, включая определение длины и сравнение двух строк.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#include <iostream> #include <string> using namespace std; int main() { string str; cout<<"Input the string\n"; getline(cin,str); cout<<"\nString entered is :"<<str; int len = str.length(); cout<<"\nLength of the string str is :"<<len; string str1 = "monitorbank"; if(str.compare(str1) == 0) { cout<<"\nTwo strings are equal\n"; } else { cout<<"\nTwo strings are not equal\n";} str1.append(".ru"); cout<<"\nNew str1 : "<<str1; str.clear(); cout<<"\n\nstr new length : "<<str.length(); return 0; |
Вывод данных:
1 2 3 4 5 6 7 8 9 10 |
Input the string monitorbank String entered is: monitorbank Length of the string str is: 11 Two strings are equal New str1: monitorbank.ru str new length : 0 |
На приведенном выше примере мы использовали многочисленные строковые функции для управления строками. После объявления строки мы используем функцию «getline» класса строки для чтения строки из стандартного ввода.
Как только мы прочитаем строку, мы найдем ее длину с помощью функции «length». Если нам нужно сравнить две строки, чтобы оценить, равны они или нет, мы можем использовать функцию «сравнить» класса строк. Если функция возвращает 0, то две строки равны, в противном случае функция возвращает ненулевое значение.
Еще одна функция заключается в добавлении другой строки в конец существующей строки. Это функция «append». В этом примере мы добавляем «.ru» к уже существующей строке str1 со значением «monitorbank».
Последняя функция в примере — это функция очистки, которая используется для очистки содержимого вызываемого строкового объекта. В этом примере мы очищаем содержимое объекта str, чтобы его длина стала равной 0.
Вывод
В этой статье мы рассмотрели массив символов, который также называется строками в стиле C, а также основы класса строк. Класс String поставляется с дополнительными утилитами, такими как класс итератора, поскольку это класс-контейнер. В следующей статье мы с вами поговорим о типах функций в C++ и их использовании.
С Уважением, МониторБанк