strlen в си что это
Функции для работы со строками
Пожалуйста, приостановите работу AdBlock на этом сайте.
В языке Си предусмотрено множество разных функций, предназначенных для работы со строками. Для их использования необходимо подключить заголовочный файл string.h
Разберём самые простые из них:
Функция strlen
Данная функция возвращает целое число – длину строки, которая ей передана в качестве аргумента.
Рис.1 Работа функции strlen.
Функция склеивания строк strcat.
Результат работы этой программы ниже:
Рис.2 Работа функции strcat.
Функция сравнения строк strcmp
Данная функция сравнивает посимвольно строки, переданные ей в качестве аргументов. Функция strcmp вернёт нуль, если строки равны между собой, иначе какое-либо другое целое число (положительное или отрицательное). Общее правило таково: Если в функции strcmp() первая строка больше, чем вторая строка, то функция возвращает положительное число. Если меньше – отрицательное. Сравнение осуществляется по кодам символов в таблице ASCII
Посмотрите на пример.
Рис.3 Работа функции strcmp.
Функция копирования строк strcpy.
Данная функция принимает на вход две строки, а потом копирует вторую строку в первую. Простой примерчик.
Рис.4 Работа функции strcpy.
Как и в случае с strcat программисту нужно самому следить за тем, чтобы в первой строке хватило места для копирования в неё второй строки.
Есть и более сложные функции работы со строками, но о них в базовой части курса мы говорить не будем.
Практика
Решите предложенные задачи:
Для удобства работы сразу переходите в полноэкранный режим
Исследовательские задачи для хакеров
Функции обработки строк в Cи
В программе строки могут определяться следующим образом:
Кроме того, должно быть предусмотрено выделение памяти для хранения строки.
Под хранение строки выделяются последовательно идущие ячейки оперативной памяти. Таким образом, строка представляет собой массив символов. Для хранения кода каждого символа строки отводится 1 байт.
При определении массива символов необходимо сообщить компилятору требуемый размер памяти.
Компилятор также может самостоятельно определить размер массива символов, если инициализация массива задана при объявлении строковой константой:
В этом случае имена m2 и m3 являются указателями на первые элементы массивов:
При объявлении массива символов и инициализации его строковой константой можно явно указать размер массива, но указанный размер массива должен быть больше, чем размер инициализирующей строковой константы:
В этом случае объявление массива переменной m4 может быть присвоен адрес массива:
Для указателя можно использовать операцию увеличения (перемещения на следующий символ):
Массивы символьных строк
В этом случае poet является массивом, состоящим из четырех указателей на символьные строки. Каждая строка символов представляет собой символьный массив, поэтому имеется четыре указателя на массивы. Указатель poet[0] ссылается на первую строку:
*poet[0] эквивалентно ‘П’,
*poet[l] эквивалентно ‘-‘.
Инициализация выполняется по правилам, определенным для массивов.
Тексты в кавычках эквивалентны инициализации каждой строки в массиве. Запятая разделяет соседние
последовательности.
Кроме того, можно явно задавать размер строк символов, используя описание, подобное такому:
Разница заключается в том, что такая форма задает «прямоугольный» массив, в котором все строки имеют одинаковую длину.
Свободный массив
Операции со строками
Большинство операций языка Си, имеющих дело со строками, работает с указателями. Для размещения в оперативной памяти строки символов необходимо:
Для выделения памяти под хранение строки могут использоваться функции динамического выделения памяти. При этом необходимо учитывать требуемый размер строки:
Функции ввода строк
Для ввода строки, включая пробелы, используется функция
В качестве аргумента функции передается указатель на строку, в которую осуществляется ввод. Функция просит пользователя ввести строку, которую она помещает в массив, пока пользователь не нажмет Enter.
Функции вывода строк
Для вывода строк можно воспользоваться рассмотренной ранее функцией
или в сокращенном формате
Для вывода строк также может использоваться функция
которая печатает строку s и переводит курсор на новую строку (в отличие от printf() ). Функция puts() также может использоваться для вывода строковых констант, заключенных в кавычки.
Функция ввода символов
Для ввода символов может использоваться функция
которая возвращает значение символа, введенного с клавиатуры. Указанная функция использовалась в рассмотренных ранее примерах для задержки окна консоли после выполнения программы до нажатия клавиши.
Функция вывода символов
Для вывода символов может использоваться функция
которая возвращает значение выводимого символа и выводит на экран символ, переданный в качестве аргумента.
Пример Посчитать количество введенных символов во введенной строке.
Результат выполнения
Основные функции стандартной библиотеки string.h
Основные функции стандартной библиотеки string.h приведены в таблице.
Пример использования функций
Результат выполнения
В предыдущей главе мы практически без объяснений использовали операцию sizeof, которая дает нам размер объектов в байтах Функция strlen( ) позволяет определять длину строки числом символов. Поскольку для размещения одного символа в памяти отводится 1 байт, можно было бы предположить, что в результате применения любой из этих двух операций к одной строке будет получен одинаковый результат. Оказывается, это не так. Давайте немного изменим нашу предыдущую программу (добавим к ней несколько строк), и тогда мы поймем, в чем дело.
#define PRAISE » Вот это да, какое великолепное имя!»
printf(» Как вас зовут? «);
printf(» Ваше имя состоит из %d букв и занимает %d ячеек памяти. «,
strlen (name), sizeof name);
printf(» Хвалебная фраза состоит из %d букв», strlen (PRAISE));
printf(» и занимает %d ячеек памяти. «, sizeof PRAISE);
Заметим, что случайно мы воспользовались двумя методами для обработки длинных операторов printf(). В первом случае мы, записав один оператор печати в двух строках программы. Мы сделали это, поскольку разрешается разбивать строку между аргументами, но не посередине строки. В другом случае использовались два оператора printf() для печати одной строки; мы указали символ «новая строка» ( ) только во втором из них. Представленный ниже результат работы данной программы поможет понять подобную ситуацию:
Привет, Перки. Вот это да, какое великолепное имя!
Ваше имя состоит из 5 букв и занимает 50 ячеек памяти.
Хвалебная фраза состоит из 35 букв и занимает 36 ячеек памяти.
Давайте посмотрим, в чем дело. Массив name занимает 50 ячеек памяти, и именно об этом сообщает операция sizeof. Но для хранения имени Перки требуются только первые пять ячеек, и как раз об этом нас информирует функция strlen( ). В шестой ячейке массива name содержится нуль-символ, и его появление служит сигналом для функции strlen( ) прекратить подсчет символов
РИС.4.4. Распознавание функцией strlen( ) конца строки
При переходе к обработке константы PRAISE обнаруживается, что функция strlen( ) опять дает нам точное число символов (включая пробелы и знаки пунктуации) в строке. Результат операции sizeof оказывается на единицу большим, поскольку при этом учитывается и «невидимый» нуль-символ, помещенный в конец строки. Мы не указываем компилятору, какой объем памяти он должен отвести для размещения всей фразы, он сам подсчитывает число символов между кавычками.
Читайте также
6.13.3 Версия, длина заголовка и длина датаграммы
6.13.3 Версия, длина заголовка и длина датаграммы В настоящее время используется четвертая версия IP (версия «Следующее поколение» имеет номер 6).Длина заголовка измеряется в 32-разрядных словах. Если не нужны дополнительные варианты, можно ограничиться длиной заголовка в 5
Длина дуги
Длина дуги С помощью команды DIMARC создается размер длины дуги, указывающий расстояние вдоль дуги или дугового сегмента полилинии (рис. 11.14). Чтобы отличать эти размеры от линейных и угловых, для размеров длины дуги по умолчанию отображается символ дуги. Команда вызывается
Длина дуги
Длина дуги С помощью команды DIMARC создается размер длины дуги, указывающий расстояние вдоль дуги или дугового сегмента полилинии (рис. 11.14). Чтобы отличать эти размеры от линейных и угловых, для размеров длины дуги по умолчанию отображается символ дуги. Команда
Особенности кодирования литеральных символов и пар расстояние/длина
Особенности кодирования литеральных символов и пар расстояние/длина В предыдущих разделах ничего не было сказано о небольшом нюансе реализации алгоритма: как в процессе считывания сжатых данных отличить литеральный символ от кода расстояние/длина? В конце концов, не
Строки
Длина дуги
Пример 9-15. Длина переменной
Длина дуги
Длина дуги С помощью команды DIMARC создается размер длины дуги, указывающий расстояние вдоль дуги или дугового сегмента полилинии (рис. 10.10). Чтобы эти размеры отличались от линейных и угловых, для размеров длины дуги по умолчанию показан символ дуги. Команда вызывается из
2.5 Строки
2.5 Строки Строка есть последовательность символов, заключенная в двойные кавычки: «. ». Строка имеет тип «массив символов» и класс памяти static (см. #4 ниже), она инициализируется зданными символами. Все строки, даже если они записаны одинково, различны. Компилятор
Какова длина второго имени?
Какова длина второго имени? Как бы стеки не заставили нас забыть, что кроме излюбленных специалистами по информатике примеров имеются структуры данных, тесно связанные с объектами реальной жизни. Вот забавный пример, взятый из почты форума Риски (Risks) (группа новостей Usenet
Строки
Строки Класс STRING описывает символьные строки. Он имеет специальный статус, поскольку нотация допускает манифестные строковые константы, обозначающие экземпляры STRING.Строковая константа записывается в двойных кавычках, например,»ABcd Ef
Синтаксис
Параметры
str
Строка, завершающаяся символом NULL.
locale
Используемый языковой стандарт.
Возвращаемое значение
Remarks
strlen интерпретирует строку как однобайтовую строку символов, поэтому ее возвращаемое значение всегда равно числу байтов, даже если строка содержит многобайтовые символы. wcslen — Это версия с расширенными символами strlen ; аргумент wcslen является строкой расширенных символов, а число символов — в расширенных (двухбайтовых) символах. wcslen **** strlen поведение и идентично в противном случае.
Примечание о безопасности. Эти функции предполагают потенциальную угрозу, связанную с проблемой переполнения буфера. Проблемы переполнения буфера — это распространенный метод атак на системы, который приводит к несанкционированному повышению уровня прав. Дополнительные сведения см. в разделе Как избежать переполнения буфера.
По умолчанию глобальное состояние этой функции ограничивается приложением. Чтобы изменить это, см. раздел глобальное состояние в CRT.
Универсальное текстовое сопоставление функций
TCHAR.H ассемблер | _UNICODE & _MBCS не определено | _MBCS определяется | _UNICODE определяется |
---|---|---|---|
_tcslen | strlen | strlen | wcslen |
_tcsclen | strlen | _mbslen | wcslen |
_tcsclen_l | strlen | _mbslen_l | wcslen |
Требования
Дополнительные сведения о совместимости см. в статье Compatibility.
Функции для работы со строками в C++
После того, как мы с вами познакомились со строками и символьными массивами в C++, рассмотрим самые распространённые функции для работы с ними. Урок будет полностью построен на практике. Мы будем писать собственные программы-аналоги для обработки строк и параллельно использовать стандартные функции библиотеки cstring ( string.h – в старых версиях). Так вы примерно будете себе представлять, как они устроены. К стандартным функциям библиотеки cstring относятся:
Это конечно не все функции, а только те, которые мы разберём в этой статье.
strlen() (от слова length – длина)
Наша программа, которая подсчитает количество символов в строке:
Так будет выглядеть код, с заменой нашего участка кода на функцию strlen() :
Результат будет и в первой программе и во второй аналогичен:
strcat() (от слова concatenation – соединение)
Программа, которая в конец одной строки, дописывает вторую строку. Другими словами – объединяет две строки.
Реализация объединения двух строк, используя стандартную функцию, заняла одну строчку кода в программе – 14-я строка.
На что следует обратить внимание и первом и во втором коде – размер первого символьного массива должен быть достаточным для помещения символов второго массива. Если размер окажется недостаточным – может произойти аварийное завершение программы, так как запись строки выйдет за пределы памяти, которую занимает первый массив. Например:
strcpy() (от слова copy – копирование)
Реализуем копирование одной строки и её вставку на место другой строки.