Как найти длину строки в с
Перейти к содержимому

Как найти длину строки в с

  • автор:

Основы работы со строками в C++

В языке 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’ .

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

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

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

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

Для считывания строки можно использовать операцию «>>» для объекта cin:

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

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

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

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

То есть можно скопировать содержимое одной строки в другую при помощи операции S1 = S2, сравнить две строки на равенство при помощи S1 == S2, сравнить строки в лексикографическом порядке при помощи S1 < S2, или сделать сложение (конкатенацию) двух строк в виде S = S1 + S2.

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

Методы строк

У строк есть разные методы, многие из них можно использовать несколькими разными способами (с разным набором параметров).

Рассмотрим эти методы подробней.

size

Метод size() возращает длину длину строки. Возвращаемое значение является беззнаковым типом (как и во всех случаях, когда функция возращает значение, равное длине строке или индексу элемента — эти значения беззнаковые). Поэтому нужно аккуратно выполнять операцию вычитания из значения, которое возвращает size(). Например, ошибочным будет запись цикла, перебирающего все символы строки, кроме последнего, в виде for (int i = 0; i < S.size() - 1; ++i).

Кроме того, у строк есть метод length(), который также возвращает длину строки.

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

resize

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, и на их место вставляются новые символы.

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.

find

Ищет в данной строке первое вхождение другой строки 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_str.

String. Length Свойство

Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.

Возвращает число знаков в текущем объекте String.

public: property int Length < int get(); >;
public int Length
member this.Length : int
Public ReadOnly Property Length As Integer
Значение свойства

Количество знаков в текущей строке.

Примеры

В следующем примере показано Length свойство .

// Sample for String::Length using namespace System; int main() < String^ str = "abcdefg"; Console::WriteLine( "1) The length of '' is ", str, str->Length ); Console::WriteLine( "2) The length of '' is ", "xyz", ((String^)"xyz")->Length ); int length = str->Length; Console::WriteLine( "1) The length of '' is ", str, length ); > /* This example displays the following output: 1) The length of 'abcdefg' is 7 2) The length of 'xyz' is 3 3) The length of 'abcdefg' is 7 */ 
string str = "abcdefg"; Console.WriteLine("1) The length of '' is ", str, str.Length); Console.WriteLine("2) The length of '' is ", "xyz", "xyz".Length); int length = str.Length; Console.WriteLine("3) The length of '' is ", str, length); // This example displays the following output: // 1) The length of 'abcdefg' is 7 // 2) The length of 'xyz' is 3 // 3) The length of 'abcdefg' is 7 
let str = "abcdefg" printfn $"1) The length of '' is " printfn $"""2) The length of '' is """ let length = str.Length printfn $"3) The length of '' is " // This example displays the following output: // 1) The length of 'abcdefg' is 7 // 2) The length of 'xyz' is 3 // 3) The length of 'abcdefg' is 7 
Class Sample Public Shared Sub Main() Dim str As String = "abcdefg" Console.WriteLine("1) The length of '' is ", str, str.Length) Console.WriteLine("2) The length of '' is ", "xyz", "xyz".Length) Dim length As Integer = str.Length Console.WriteLine("1) The length of '' is ", str, length) End Sub End Class ' 'This example displays the following output: ' 1) The length of 'abcdefg' is 7 ' 2) The length of 'xyz' is 3 ' 3) The length of 'abcdefg' is 7 

Комментарии

Свойство Length возвращает количество Char объектов в этом экземпляре, а не число символов Юникода. Причина в том, что символ Юникода может быть представлен несколькими Char. System.Globalization.StringInfo Используйте класс для работы с каждым символом Юникода вместо каждого Char.

В некоторых языках, таких как C и C++, символ NULL обозначает конец строки. В .NET символ null можно внедрить в строку. Если строка содержит один или несколько символов NULL, они включаются в длину строки итогов. Например, в следующей строке подстроки «abc» и «def» разделяются символом NULL. Свойство Length возвращает значение 7, указывающее, что оно включает шесть букв, а также пустой символ.

using namespace System; using namespace System::Text; void main() < String^ characters = "abc" + L'0' + "def"; Console::WriteLine(characters->Length); // Displays 7 > 
string characters = "abc\u0000def"; Console.WriteLine(characters.Length); // Displays 7 
let characters = "abc\u0000def" printfn $"" // Displays 7 
Imports System.Text Module Example Public Sub Main() Dim characters As String = "abc" + ChrW(0) + "def" Console.WriteLine(characters.Length) ' Displays 7 End Sub End Module 

String.length

Свойство length представляет длину строки.

Синтаксис

str.length

Описание

Это свойство возвращает количество кодовых значений в строке. В UTF-16, строковом формате, используемом в JavaScript, для представления большинства символов используется одно 16-битное кодовое значение, но для представления не так часто используемых символов требуется два кодовых значения, так что вполне может быть так, что значение, возвращённое свойством length не будет соответствовать действительному количеству символов в строке.

Для пустых строк свойство length возвращает 0.

Статическое свойство String.length возвращает значение 1.

Примеры

Пример: базовое использование

var x = "Mozilla"; var empty = ""; console.log("Слово «Mozilla» занимает " + x.length + " кодовых значений"); /* "Слово «Mozilla» занимает 7 кодовых значений" */ console.log("Пустая строка имеет длину, равную " + empty.length); /* "Пустая строка имеет длину, равную 0" */ 

Спецификации

Specification
ECMAScript Language Specification
# sec-properties-of-string-instances-length

Совместимость с браузерами

BCD tables only load in the browser

Смотрите также

Found a content problem with this page?

  • Edit the page on GitHub.
  • Report the content issue.
  • View the source on GitHub.

This page was last modified on 11 окт. 2023 г. by MDN contributors.

Your blueprint for a better internet.

Определение длины строки в С и С++

Главное различие в том, что функция strlen вычисляет длину строки, а оператор sizeof к вычислению длины строки никакого отношения не имеет. Оператор sizeof используется для определения размера памяти занимаемой сущностью. При работе со строками он может быть применим только к строкам, определенным на стеке и константным строкам. Механизм работы можно увидеть на примере:

char *pStr = "string"; char str[20]; strcpy(str, pStr); int len1 = strlen(pStr); // = 6 int len2 = strlen(str); // = 6 int len3 = sizeof(pStr); // = 4, если используется 32-х битная система int len4 = sizeof(str); // = 20 int len5 = sizeof("string"); // = 7 

Отслеживать
9,375 7 7 золотых знаков 24 24 серебряных знака 57 57 бронзовых знаков
ответ дан 24 ноя 2010 в 12:52
Nicolas Chabanovsky Nicolas Chabanovsky
51.4k 87 87 золотых знаков 267 267 серебряных знаков 505 505 бронзовых знаков

sizeof — это оператор языка, применяемый для определения размера типа данных в байтах. Значение выражения с использованием sizeof определяется во время компиляции кода, за исключением ряда случаев, например, для массивов переменной длины, определенных в C99.

strlen — это функция стандартной библиотеки C, применяемая для определения длины строки, оканчивающейся нулем. Значение выражения с использованием вызова strlen определяется во время выполнения кода.

Отслеживать
ответ дан 25 ноя 2010 в 11:28
34.5k 26 26 золотых знаков 98 98 серебряных знаков 214 214 бронзовых знаков

Обращу внимание, что sizeof возвращает размер объекта в байтах. Т.е. обычно это максимальная длина строки, которая влезает в массив char’ов.

strlen — это функция стандартной библиотеки для определения длины 0-terminated строки. Возвращает кол-во символов без терминирующего 0. Т.е. реально занимаемый в памяти объем строки равен как минимум результату выполнения strlen + 1 байт.

Реально проблемы обычно возникают при работе с Юникодом, т.е. с типами wchar или TCHAR и соответствующими ф-циями. Потому что юникодовские символы занимают не 1 байт, а 2. И поэтому смешивать кол-во символов и размер их в памяти, получается, уже не стоит. А учитывая, что многие программы рано или поздно придется переделывать — лучше сразу заложить возможность для этого. Т.е. итого — запоминаем, что ф-ции работы со строками обычно требуют размер (или макс. размер) строки в символах, а ф-ции работы с памятью — обычно в байтах.

Для определения максимального кол-ва элементов (т.е. символов в строке) под MSVC я использовал макрос _countof. Мне он показался достаточно удобным.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *