Как мы уже поняли из
предыдущих уроков, строки это всего лишь набор байтов, а точнее массив типа
char.
Сегодня рассмотрим функции, которые можно использовать на
кошках строках.
Отмечу, что легко написать свои аналогичные функции и они будут выполняться также быстро, как и библиотечные (в этом и прелесть Си), но с другой стороны
на какой изобретать велосипед?Начнем-с.
Длина строки
strlen - возвращает количество символов до символа \0. При передаче мусора – программа может выпасть или зависнуть, если будет искать этот самый символ бесконечно.
Возвращает – без знаковое целое число (
unsigned int), что в принципе логично – длина строки явно положительная величина.
Копировать строку в строку
strcpy. Копирует в заданную строку, другую без ограничения размера первой строки, пока у второй строки не попадется символ \0, символ \0 также копируется. Синтаксис
strcpy(v, ”Hello”);Для копирования определенного количества символов нужно использовать
strncpy, где указывается количество копируемых символов, также не контролируется размер исходной строки, синтаксис
strncpy(v, ”Hello”, 4), но в этом случае символ \0 не добавляется в конец исходной строки (иными словами strncpy это алиас memcpy и не более того)
Поиск заданного символа в строке
strchr - возвращает указатель на символ, либо NULL, если символа увы нет. Синтаксис -
v=strchr(str,'a'), где
v, указатель на char (
char *).
Поиск заданной подстроки в строке
strstr - возвращает указатель на первый символ в строке в случае успеха, а в случае неудачи возвращает… NULL!
Синтаксис:
v = strstr(str, "Hello");Сравнение строк
strcmp - возвращает 0 в случае полного сравнения, 1 если первая строка больше, -1 если меньше. Больше и меньше – это конечно по ASCII-коду символа, который не совпал. Удобно для сортировки.
У функции есть более прогрессивный потомок
strncmp, который также сравнивает строки, но только до определенной позиции(длины).
Синтаксис:
strncmp(str, "hello", 4) - т.е. добавилось только количество сравниваемых символов.
Даже не знаю, что добавить. Хотя, помню когда я пришел в Си из Бейсика мне часто не хватало функции MID, или
substr.
Ответ пришел очевиден – допустим нужно сравнить строку на совпадение трех символов, начиная с второго как 'ID:', а последующие 4 тогда определить как число. Исходная строка:
xID:0034UserВ Си
if ( (v = strnstr(str+1,’ID:’))) {strncpy(temp,str+4,4);temp[4]=0;id=atoi(temp);}