вторник, 25 января 2011 г.

Строки и функции с ними

Как мы уже поняли из предыдущих уроков, строки это всего лишь набор байтов, а точнее массив типа 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);}