Как узнать размер строки

Как узнать размер строки

Как мне получить количество символов в строке на С++?

Если вы используете std::string , вызовите length() :

Если вы используете c-строку, вызовите strlen() .

Или, если вам нравится использовать строки в стиле Pascal (или строки f *****, как Joel Spolsky любит их называть когда у них есть конечный NULL), просто разыщите первый символ.

При работе со строками С++ (std::string) вы ищете length() или size(). Оба должны предоставить вам то же значение. Однако при работе со строками C-Style вы должны использовать strlen().

Вывод:

Это зависит от того, какой тип строки вы говорите. Существует много типов строк:

  • const char* — многобайтовая строка в стиле C
  • const wchar_t* — широкая строка в стиле C
  • std::string — "стандартная" многобайтовая строка
  • std::wstring — "стандартная" широкая строка

Для 3 и 4 вы можете использовать методы .size() или .length() .

Для 1 вы можете использовать strlen() , но вы должны убедиться, что строковая переменная не является NULL (=== 0)

Для 2 вы можете использовать wcslen() , но вы должны убедиться, что строковая переменная не является NULL (=== 0)

Существуют и другие типы строк в нестандартных библиотеках С++, таких как MFC CString , ATL CComBSTR , ACE ACE_CString и т.д., с такими методами, как .GetLength() и т.д. Я не могу вспомнить их особенности прямо с головы.

Библиотеки STLSoft абстрагировали все это с помощью того, что они называют плагины доступа к строке, которые могут использоваться для получения длины строки (и других аспектов) любого типа. Итак, для всех вышеперечисленных (включая нестандартные библиотеки), используя ту же функцию stlsoft::c_str_len() . Эта статья описывает, как все это работает, поскольку это не все полностью очевидно или легко.

В языке C++ для удобной работы со строками есть класс string, для использования которого необходимо подключить заголовочный файл string.

Строки можно объявлять и одновременно присваивать им значения:

string S1, S2 = "Hello";

Строка S1 будет пустой, строка S2 будет состоять из 5 символов.

К отдельным символам строки можно обращаться по индексу, как к элементам массива или C-строк. Например S[0] — это первый символ строки.

Для того, чтобы узнать длину строки можно использовать метод size() строки. Например, последний символ строки S это S[S.size() — 1 ].

Строки в языке C++ могут

Конструкторы строк

Строки можно создавать с использованием следующих конструкторов:
string() — конструктор по умолчанию (без параметров) создает пустую строку.
string(string & S) — копия строки S
string( size_t n, char c) — повторение символа c заданное число n раз.
string(size_t c) — строка из одного символа c .
string(string & S, size_t start, size_t len) — строка, содержащая не более, чем len символов данной строки S , начиная с символа номер start .

Конструкторы можно вызывать явно, например, так:

В этом примере явно вызывается конструктор string для создания строки, состоящей из 10 символов ‘z’ .

Неявно конструктор вызывается при объявлении строки с указанием дополнительных параметров. Например, так:

Подробней о конструкторах для строк читайте здесь.

Ввод-вывод строк

Строка выводится точно так же, как и числовые значения:

cout >" для объекта cin:

В этом случае считывается строка из непробельных символов, пропуская пробелы и концы строк. Это удобно для того, чтобы разбивать текст на слова, или чтобы читать данные до конца файла при помощи while (cin >> S) .

Читайте также:  Во сне разбил телефон к чему

Можно считывать строки до появления символа конца строки при помощи функции getline. Сам символ конца строки считывается из входного потока, но к строке не добавляется:

Арифметические операторы

Со строками можно выполнять следующие арифметические операции:
= — присваивание значения.
+= — добавление в конец строки другой строки или символа.
+ — конкатенация двух строк, конкатенация строки и символа.
== , != — посимвольное сравнение.
, > , , >= — лексикографическое сравнение.

То есть можно скопировать содержимое одной строки в другую при помощи операции S1 = S2, сравнить две строки на равенство при помощи S1 == S2, сравнить строки в лексикографическом порядке при помощи S1 S.resize(n) — Изменяет длину строки, новая длина строки становится равна n. При этом строка может как уменьшится, так и увеличиться. Если вызвать в виде S.resize(n, c) , где c — символ, то при увеличении длины строки добавляемые символы будут равны c.

Подробней о методе resize.

clear

S.clear() — очищает строчку, строка становится пустой.

Подробней о методе clear.

empty

S.empty() — возвращает true, если строка пуста, false — если непуста.

Подробней о методе empty.

push_back

S.push_back(c) — добавляет в конец строки символ c, вызывается с одним параметром типа char.

Подробней о методе push_back.

append

Добавляет в конец строки несколько символов, другую строку или фрагмент другой строки. Имеет много способов вызова.

S.append(n, c) — добавляет в конец строки n одинаковых символов, равных с. n имеет целочисленный тип, c — char.

S.append(T) — добавляет в конец строки S содержимое строки T. T может быть объектом класса string или C-строкой.

S.append(T, pos, count) — добавляет в конец строки S символы строки T начиная с символа с индексом pos количеством count.

Подробней о методе append.

erase

S.erase(pos) — удаляет из строки S с символа с индексом pos и до конца строки.

S.erase(pos, count) — удаляет из строки S с символа с индексом pos количеством count или до конца строки, если pos + count > S.size().

Подробней о методе erase.

insert

Вставляет в середину строки несколько символов, другую строку или фрагмент другой строки. Способы вызова аналогичны способам вызова метода append, только первым параметром является значение i — позиция, в которую вставляются символы. Первый вставленный символ будет иметь индекс i, а все символы, которые ранее имели индекс i и более сдвигаются вправо.

S.insert(i, n, c) — вставить n одинаковых символов, равных с. n имеет целочисленный тип, c — char.

S.insert(i, T) — вставить содержимое строки T. T может быть объектом класса string или C-строкой.

S.insert(i, T, pos, count) — вставить символы строки T начиная с символа с индексом pos количеством count.

Подробней о методе insert.

substr

S.substr(pos) — возвращает подстроку данной строки начиная с символа с индексом pos и до конца строки.

S.substr(pos, count) — возвращает подстроку данной строки начиная с символа с индексом pos количеством count или до конца строки, если pos + count > S.size().

Подробней о методе substr.

replace

Заменяет фрагмент строки на несколько равных символов, другую строку или фрагмент другой строки. Способы вызова аналогичны способам вызова метода append, только первыми двумя параметрами являются два числа: pos и count. Из данной строки удаляется count символов, начиная с символа pos, и на их место вставляются новые символы.

Читайте также:  Как в 1с открыть закрытый период

S.replace(pos, count, n, c) — вставить n одинаковых символов, равных с. n имеет целочисленный тип, c — char.

S.replace(pos, count, T) — вставить содержимое строки T. T может быть объектом класса string или C-строкой.

S.replace(pos, count, T, pos2, count2) — вставить символы строки T начиная с символа с индексом pos количеством count.

Подробней о методе replace.

Ищет в данной строке первое вхождение другой строки str. Возвращается номер первого символа, начиная с которого далее идет подстрока, равная строке str. Если эта строка не найдена, то возвращается константа string::npos (которая равна -1, но при этом является беззнаковой, то есть на самом деле является большим безннаковым положительным числом).

Если задано значение pos, то поиск начинается с позиции pos, то есть возращаемое значение будет не меньше, чем pos. Если значение pos не указано, то считается, что оно равно 0 — поиск осуществляется с начала строки.

S.find(str, pos = 0) — искать первое входение строки str начиная с позиции pos. Если pos не задано — то начиная с начала строки S.

S.find(str, pos, n) — искать в данной строке подстроку, равную первым n символам строки str. Значение pos должно быть задано.

Подробней о методе find.

rfind

Ищет последнее вхождение подстроки ("правый" поиск). Способы вызова аналогичны способам вызова метода find.

Подробней о методе rfind.

find_first_of

Ищет в данной строке первое появление любого из символов данной строки str. Возвращается номер этого символа или значение string::npos.

Если задано значение pos, то поиск начинается с позиции pos, то есть возращаемое значение будет не меньше, чем pos. Если значение pos не указано, то считается, что оно равно 0 — поиск осуществляется с начала строки.

S.find_first_of(str, pos = 0) — искать первое входение любого символа строки str начиная с позиции pos. Если pos не задано — то начиная с начала строки S.

find_last_of

Ищет в данной строке последнее появление любого из символов данной строки str. Способы вызова и возвращаемое значение аналогичны методу find_first_of.

Подробней о методе find_last_of.

find_first_not_of

Ищет в данной строке первое появление символа, отличного от символов строки str. Способы вызова и возвращаемое значение аналогичны методу find_first_of.

find_last_not_of

Ищет в данной строке последнее появление символа, отличного от символов строки str. Способы вызова и возвращаемое значение аналогичны методу find_first_of.

c_str

Возвращает указать на область памяти, в которой хранятся символы строки, возвращает значение типа char*. Возвращаемое значение можно рассматривать как C-строку и использовать в функциях, которые должны получать на вход C-строку.

После того, как мы с вами познакомились со строками и символьными массивами в C++, рассмотрим самые распространённые функции для работы с ними. Урок будет полностью построен на практике. Мы будем писать собственные программы-аналоги для обработки строк и параллельно использовать стандартные функции библиотеки cstring ( string.h – в старых версиях). Так вы примерно будете себе представлять, как они устроены. К стандартным функциям библиотеки cstring относятся:

  • strlen() – подсчитывает длину строки (количество символов без учета );
  • strcpy() – копирует символы одной строки в другую;
  • strcmp() – сравнивает между собой две строки .
Читайте также:  Intel pentium d 805 характеристики

Это конечно не все функции, а только те, которые мы разберём в этой статье.

strlen() (от слова length – длина)

Наша программа, которая подсчитает количество символов в строке:

Для подсчёта символов в строке неопределённой длины (так как вводит её пользователь), мы применили цикл while – строки 13 – 17. Он перебирает все ячейки массива (все символы строки) поочередно, начиная с нулевой. Когда на каком-то шаге цикла встретится ячейка ourStr [amountOfSymbol] , которая хранит символ , цикл приостановит перебор символов и увеличение счётчика amountOfSymbol .

Так будет выглядеть код, с заменой нашего участка кода на функцию strlen() :

Как видите, этот код короче. В нем не пришлось объявлять дополнительные переменные и использовать цикл. В выходном потоке cout мы передали в функцию строку – strlen(ourStr) . Она посчитала длину этой строки и вернула в программу число. Как и в предыдущем коде-аналоге, символ не включен в общее количество символов.

Результат будет и в первой программе и во второй аналогичен:

strcat() (от слова concatenation – соединение)

Программа, которая в конец одной строки, дописывает вторую строку. Другими словами – объединяет две строки.

По комментариям в коде должно быть всё понятно. Ниже напишем программу для выполнения таких же действий, но с использованием strcat() . В эту функцию мы передадим два аргумента (две строки) – strcat ( someText1 , someText2 ) ; . Функция добавит строку someText2 к строке someText1 . При этом символ ‘’ в конце someText1 будет перезаписан первым символом someText2 . Так же она добавит завершающий ‘’

Реализация объединения двух строк, используя стандартную функцию, заняла одну строчку кода в программе – 14-я строка.

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

В этом случае, строковая константа “Учите С++ c нами!” не может быть записана в массив someText1 . В нём недостаточно места, для такой операции.

Если вы используете одну из последних версий среды разработки Microsoft Visual Studio, возможно возникновение следующей ошибки: “error C4996: ‘strcat’: This function or variable may be unsafe. Consider using strcat_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.” Так происходит потому, что уже разработана новая более безопасная версия функции strcat – это strcat_s .

Она заботится о том, чтобы не произошло переполнение буфера (символьного массива, в который производится запись второй строки). Среда предлагает вам использовать новую функцию, вместо устаревшей. Почитать больше об этом можно на сайте msdn. Подобная ошибка может появиться, если вы будете применять функцию strcpy , о которой речь пойдет ниже.

strcpy() (от слова copy – копирование)

Реализуем копирование одной строки и её вставку на место другой строки.

Ссылка на основную публикацию
Как узнать песню если не знаешь названия
Знакомая ситуация: в голове крутится одна и та же композиция, но вспомнить название, хоть убей, не получается? Лайфхакер поможет определить...
Как удалить повторяющиеся значения в столбце excel
Доброго времени суток! С популяризацией компьютеров за последние 10 лет — происходит и популяризация создания отчетов (документов) в программе Excel....
Как удалить поиск в windows 10
Привет ребята Значит если вам надоел процесс SearchUI.exe, то пора от него избавляться. Как остановить службу SearchUI.exe? Вот тут к...
Как узнать пишущий ли дисковод на компьютере
Использование дисководов в компьютерах – DVD и CD-ROM – все дальше отходят на второй план. Но работа с ними для...
Adblock detector