1. Главная страница » Компьютеры

C массив строк char

Автор: | 16.12.2019

Для char [] Я могу легко получить его длину:

Тем не менее, я не могу сделать так, чтобы получить длину char * от:

потому что я знаю, a вот указатель, такой что length здесь всегда будет 4 (или что-то другое в разных системах).

Мой вопрос заключается в том, как я могу получить длину char * после этого? Я знаю, что кто-то может бросить мне вызов, что вы уже знаете его 10 потому что вы только что создали это. Я хочу знать это, потому что этот шаг получения его длины может пройти долгий путь от его создания, и я не хочу возвращаться далеко назад, чтобы проверить это число. Кроме того, я также хочу знать его реальную длину.

Чтобы быть более конкретным

  • как я могу получить его реально length=5 ?
  • как я могу получить его общее length=10 ?

для следующего примера:

Решение

Ты не можешь Во всяком случае, не со 100% точностью. Указатель не имеет длины / размера, но имеет свои. Все, что он делает, это указывает на определенное место в памяти, которое содержит символ. Если этот символ является частью строки, то вы можете использовать strlen определить, какие символы следуют за указанным в данный момент, но это не означает, что массив в твоем случае такой большой.
В принципе:

указатель это не массив, так что это не необходимость знать, каков размер массива. Указатель может указывать на одно значение, поэтому указатель может существовать, даже не будучи массивом. Его даже не волнует, где находится память, на которую он указывает (только чтение, куча или стек … не имеет значения). Указатель не имеет длины, отличной от себя. Указатель просто …
Учти это:

Читайте также:  163 Com на русском

Указатель может быть одним символом, а также началом, концом или серединой массива …

Думайте о символах как о структурах. Иногда вы выделяете одну структуру в куче. Это также создает указатель без массива.

Используя только указатель, определить, на какой массив он указывает, невозможно. Самое близкое, к которому вы можете добраться, это использование calloc и подсчет количества последовательных символов 0, которые вы можете найти через указатель. Конечно, это не сработает, если вы присвоили / переназначили материал для ключей этого массива, и это также даст сбой, если память просто вне массива случается держать , тоже. Поэтому использование этого метода ненадежно, опасно и просто глупо. Не. Делать. Это.

Еще одна аналогия:
Думайте о указателе как о дорожном знаке, он указывает на Город Х. Знак не знает, как выглядит этот город, и не знает и не заботится (или может не заботиться) о том, кто там живет. Это работа, чтобы сказать вам, где найти Город Х. Он может только сказать вам, насколько далеко этот город, но не насколько он большой. Эта информация считается неактуальной для дорожных знаков. Это то, что вы можете узнать, только взглянув на сам город, а не на дорожные знаки, указывающие вам его направление

Итак, используя указатель, вы можете только:

Но это, конечно, работает, только если массив / строка заканчивается 0.

В качестве помощника:

на самом деле присваивает size_t (возвращаемый тип sizeof ) для int Лучше всего написать:

поскольку size_t тип без знака, если sizeof возвращает большие значения, значение length может быть что-то, чего ты не ожидал …

Другие решения

Если char * 0-терминатор, вы можете использовать strlen

В противном случае невозможно определить эту информацию.

Есть только два способа:

Если указатель памяти на ваш char * представляет строку C (то есть, она содержит символы, которые имеют 0-байт, чтобы отметить его конец), вы можете использовать strlen(a) ,

В противном случае вам нужно где-то хранить длину. На самом деле указатель указывает только на один char , Но мы можем обращаться с ним так, как будто он указывает на первый элемент массива. Поскольку «длина» этого массива неизвестна, вам нужно где-то хранить эту информацию.

Учитывая только указатель, вы не можете. Вы должны будете держать длину, которую вы прошли new[] или лучше используйте std::vector чтобы следить за длиной, и освободить память, когда вы закончили с ним.

Примечание: этот ответ касается только C ++, но не C.

Просто используйте std::vector которые сохраняют (динамический) размер для вас. (Бонус, управление памятью бесплатно).

Или же std::array которые сохраняют (статический) размер.

Создайте структуру для хранения информации, например:

Мой вопрос заключается в том, как я могу получить длину символа *

Это очень просто. 🙂 Достаточно добавить только одно утверждение

Теперь вы можете получить размер выделенного массива

Многие упоминали здесь C стандартную функцию std :: strlen. Но он не возвращает фактический размер массива символов. Возвращает только размер хранимого строкового литерала.

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

тогда std :: strlen (a) вернет 5 вместо 6, как в вашем коде.

Таким образом, вывод прост: если вам нужно динамически выделить массив символов, рассмотрите использование класса std::string , Он имеет размер metaof и длину синонима, что позволяет в любой момент получить размер массива.

Это может звучать как Зло ™, и я не проверял его, но как насчет инициализации всех значений в массиве при выделении ‘’ а затем с помощью strlen() ? Это даст вам ваш так называемый реальная стоимость так как он перестанет считать на первом ‘’ это встречает.

Что ж, теперь, когда я думаю об этом, пожалуйста, никогда не делайте этого. Если только вы не захотите приземлиться в кучу грязной памяти.

Кроме того, для выделенной памяти или Общая память Вы можете использовать следующие функции, если ваша среда предоставляет их:

Вы можете реализовать свой собственный new а также delete функции, а также дополнительный get-size функция:

Кроме того, вы можете переопределить new а также delete операторы аналогичным образом.

Определение

Копирует знаки данного экземпляра в массив знаков Юникода. Copies the characters in this instance to a Unicode character array.

Перегрузки

Копирует знаки из указанной подстроки данного экземпляра в массив знаков Юникода. Copies the characters in a specified substring in this instance to a Unicode character array.

Копирует знаки данного экземпляра в массив знаков Юникода. Copies the characters in this instance to a Unicode character array.

ToCharArray(Int32, Int32)

Копирует знаки из указанной подстроки данного экземпляра в массив знаков Юникода. Copies the characters in a specified substring in this instance to a Unicode character array.

Параметры

Начальная позиция подстроки в данном экземпляре. The starting position of a substring in this instance.

Длина подстроки в данном экземпляре. The length of the substring in this instance.

Возвраты

Массив знаков Юникода, элементами которого являются length знаков данного экземпляра начиная с позиции startIndex . A Unicode character array whose elements are the length number of characters in this instance starting from character position startIndex .

Исключения

Значение параметра startIndex или length меньше нуля. startIndex or length is less than zero.

— или — -or- startIndex + length больше длины этого экземпляра. startIndex plus length is greater than the length of this instance.

Примеры

В следующем примере подстрока в строке преобразуется в массив символов, затем перечисляется и отображаются элементы массива. The following example converts a substring within a string to an array of characters, then enumerates and displays the elements of the array.

Комментарии

Этот метод копирует символы из части строки в массив символов. This method copies the characters in a portion of a string to a character array. Чтобы создать строку из диапазона символов в массиве символов, вызовите конструктор String(Char[], Int32, Int32). To create a string from a range of characters in a character array, call the String(Char[], Int32, Int32) constructor.

Параметр startIndex отсчитывается от нуля. The startIndex parameter is zero-based. То есть индекс первого символа в экземпляре строки равен нулю. That is, the index of the first character in the string instance is zero.

Если length равно нулю, возвращаемый массив пуст и имеет нулевую длину. If length is zero, the returned array is empty and has a zero length. Если этот экземпляр имеет null или пустую строку (""), возвращаемый массив пуст и имеет нулевую длину. If this instance is null or an empty string (""), the returned array is empty and has a zero length.

Чтобы создать массив байтов, содержащий закодированные символы в части строки, создайте экземпляр соответствующего объекта Encoding и вызовите его метод GetBytes(String, Int32, Int32, Byte[], Int32). To create a byte array that contains the encoded characters in a portion of a string, instantiate the appropriate Encoding object and call its GetBytes(String, Int32, Int32, Byte[], Int32) method. Ниже перечислены некоторые из стандартных кодировок, доступных в .NET. Some of the standard encodings available in .NET include:

кодировка Encoding Object Object
ASCII ASCII ASCIIEncoding
UTF-7 UTF-7 UTF7Encoding
UTF-8 UTF-8 UTF8Encoding
UTF-16 UTF-16 UnicodeEncoding
UTF-32 UTF-32 UTF32Encoding

Дополнительно

ToCharArray()

Копирует знаки данного экземпляра в массив знаков Юникода. Copies the characters in this instance to a Unicode character array.

Возвраты

Массив знаков Юникода, элементами которого являются отдельные знаки из данного экземпляра. A Unicode character array whose elements are the individual characters of this instance. Если этот экземпляр является пустой строкой, то возвращаемый массив пуст и его длина равна нулю. If this instance is an empty string, the returned array is empty and has a zero length.

Примеры

В следующем примере вызывается метод ToCharArray для извлечения символов из строки в массив символов. The following example calls the ToCharArray method to extract the characters in a string to a character array. Затем она отображает исходную строку и элементы в массиве. It then displays the original string and the elements in the array.

В следующем примере определяется строка, содержащая символы, которые служат разделителями в строке с разделителями. The following example defines a string containing the characters that serve as delimiters in a delimited string. Затем он вызывает метод ToCharArray, чтобы создать массив символов, который можно передать в метод Split(Char[]), чтобы разделить строку с разделителями на отдельные подстроки. It then calls the ToCharArray method to create a character array that can be passed to the Split(Char[]) method to separate the delimited string into its individual substrings.

Комментарии

Этот метод копирует каждый символ (то есть каждый объект Char) в строке в массив символов. This method copies each character (that is, each Char object) in a string to a character array. Первый скопированный символ находится в нулевом индексе возвращенного массива символов; последний скопированный символ находится в индексе Array.Length-1. The first character copied is at index zero of the returned character array; the last character copied is at index Array.Length — 1.

Чтобы создать строку из символов в массиве символов, вызовите конструктор String(Char[]). To create a string from the characters in a character array, call the String(Char[]) constructor.

В программе строки могут определяться следующим образом:

  • как строковые константы;
  • как массивы символов;
  • через указатель на символьный тип;
  • как массивы строк.

Кроме того, должно быть предусмотрено выделение памяти для хранения строки.

Любая последовательность символов, заключенная в двойные кавычки «» , рассматривается как строковая константа .

Для корректного вывода любая строка должна заканчиваться нуль-символом ‘’ , целочисленное значение которого равно 0. При объявлении строковой константы нуль-символ добавляется к ней автоматически. Так, последовательность символов, представляющая собой строковую константу, будет размещена в оперативной памяти компьютера, включая нулевой байт.

Под хранение строки выделяются последовательно идущие ячейки оперативной памяти. Таким образом, строка представляет собой массив символов. Для хранения кода каждого символа строки отводится 1 байт.

Для помещения в строковую константу некоторых служебных символов используются символьные комбинации. Так, если необходимо включить в строку символ двойной кавычки, ему должен предшествовать символ «обратный слеш»: ‘»‘ .

Строковые константы размещаются в статической памяти. Начальный адрес последовательности символов в двойных кавычках трактуется как адрес строки. Строковые константы часто используются для осуществления диалога с пользователем в таких функциях, как printf() .

При определении массива символов необходимо сообщить компилятору требуемый размер памяти.

Компилятор также может самостоятельно определить размер массива символов, если инициализация массива задана при объявлении строковой константой:

В этом случае имена m2 и m3 являются указателями на первые элементы массивов:

  • m2 эквивалентно &m2[0]
  • m2[0] эквивалентно ‘Г’
  • m2[1] эквивалентно ‘o’
  • m3 эквивалентно &m3[0]
  • m3[2] эквивалентно ‘x’

При объявлении массива символов и инициализации его строковой константой можно явно указать размер массива, но указанный размер массива должен быть больше, чем размер инициализирующей строковой константы:

Для задания строки можно использовать указатель на символьный тип .

В этом случае объявление массива переменной m4 может быть присвоен адрес массива:

Здесь m3 является константой-указателем. Нельзя изменить m3 , так как это означало бы изменение положения (адреса) массива в памяти, в отличие от m4 .

Для указателя можно использовать операцию увеличения (перемещения на следующий символ):

Массивы символьных строк

Иногда в программах возникает необходимость описание массива символьных строк . В этом случае можно использовать индекс строки для доступа к нескольким разным строкам.

В этом случае poet является массивом, состоящим из четырех указателей на символьные строки. Каждая строка символов представляет собой символьный массив, поэтому имеется четыре указателя на массивы. Указатель poet[0] ссылается на первую строку:
*poet[0] эквивалентно ‘П’,
*poet[l] эквивалентно ‘-‘.

Инициализация выполняется по правилам, определенным для массивов.
Тексты в кавычках эквивалентны инициализации каждой строки в массиве. Запятая разделяет соседние
последовательности.
Кроме того, можно явно задавать размер строк символов, используя описание, подобное такому:

Разница заключается в том, что такая форма задает «прямоугольный» массив, в котором все строки имеют одинаковую длину.

Свободный массив

Операции со строками

Большинство операций языка Си, имеющих дело со строками, работает с указателями. Для размещения в оперативной памяти строки символов необходимо:

  • выделить блок оперативной памяти под массив;
  • проинициализировать строку.

Для выделения памяти под хранение строки могут использоваться функции динамического выделения памяти. При этом необходимо учитывать требуемый размер строки:

Для ввода строки использована функция scanf() , причем введенная строка не может превышать 9 символов. Последний символ будет содержать ‘’ .

Функции ввода строк

Для ввода строки может использоваться функция scanf() . Однако функция scanf() предназначена скорее для получения слова, а не строки. Если применять формат "%s" для ввода, строка вводится до (но не включая) следующего пустого символа, которым может быть пробел, табуляция или перевод строки.

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

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

Функции вывода строк

Для вывода строк можно воспользоваться рассмотренной ранее функцией

или в сокращенном формате

Для вывода строк также может использоваться функция

которая печатает строку s и переводит курсор на новую строку (в отличие от printf() ). Функция puts() также может использоваться для вывода строковых констант, заключенных в кавычки.

Функция ввода символов

Для ввода символов может использоваться функция

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

Функция вывода символов

Для вывода символов может использоваться функция

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

Пример Посчитать количество введенных символов во введенной строке.

Результат выполнения

Основные функции стандартной библиотеки string.h

Основные функции стандартной библиотеки string.h приведены в таблице.

Функция Описание
присоединяет s2 к s1, возвращает s1
присоединяет не более n символов s2 к s1, завершает строку символом ‘’, возвращает s1
копирует строку s2 в строку s1, включая ‘’, возвращает s1
копирует не более n символов строки s2 в строку s1, возвращает s1;
сравнивает s1 и s2, возвращает значение 0, если строки эквивалентны
сравнивает не более n символов строк s1 и s2, возвращает значение 0, если начальные n символов строк эквивалентны
возвращает количество символов в строке s
заполняет строку s символами, код которых равен значению c, возвращает указатель на строку s
заменяет первые n символов строки s символами, код которых равен c, возвращает указатель на строку s

Пример использования функций

Результат выполнения

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

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