Хелпикс

Главная

Контакты

Случайная статья





Функции стандартной библиотеки для работы со строками в стиле С (заголовочный файл string.h).



Функции стандартной библиотеки для работы со строками в стиле С (заголовочный файл string.h).

Нахождение первого вхождения символа в блок памяти

void *memchr(const void *p, int ch, size_t n);

Возвращает указатель на первое вхождение байта, представленного младшим байтом аргумента ch в блоке памяти р длиной n.

Тип size_t (заголовочный файл <stdio.h>) является беззнаковым целочисленным типом, используемым для представления результата операции sizeof. Этот тип не может быть длиннее, чем unsigned long.

Сравнение блоков памяти

int memcmp(const void *p1, const void *p2, size_t n);

Сравнивает два блока памяти и возвращает значение: меньше нуля, равное нулю или больше нуля — аналогично кодам возврата функции strcmp.

Копирование блоков памяти

void *memcpy(void *dest, const void *src, size_t n);

Копирует блок памяти длиной n байт из адреса src по адресу dest.

void *memmove( void *dest, const void *src, size_t n);

Функция аналогична memcpy, но блоки dest и src могут перекрываться.

Заполнение блока памяти символами

void *memset(const void *p, int ch, size_t n);

Заполняет блок памяти символом, взятым из младшего байта ch.

Сложение строк

char *strcat(char *s1, char *s2);

Добавляет s2 к s1 и возвращает s1. В конец результирующей строки добавляется нуль-символ.

Поиск символа в строке

char *strchr(char *s, int ch);

Возвращает указатель на первое вхождение символа ch в строку s, если его нет, то возвращается NULL.

Сравнение строк

int *strcmp(char *s1, char *s2);

Сравнивает строки и возвращает отрицательное (если s1 меньше s2), нулевое (если s1 равно s2) или положительное (если s1 больше s2) значение.

char *strcoll(char *sl, char *s2);

Cравнивает строки аналогично strcmp, но учитывает установки локализации (информацию, зависящую от страны).

Копирование строк

char *strcpy(char *sl, char *s2);

Функция копирует s2 в s1 и возвращает s1.

Поиск символов одной строки в другой

size_t strcspn(char *sl, char *s2);

Возвращает значение индекса любого из символов из s2 в строке s1.

Поиск строки с описанием ошибки

char *strerror(size_t n);

Возвращает указатель на строку с описанием ошибки номер n.

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

size_t strlen(char *s);

Функция возвращает длину строки (без учета нуль-символа).

Сложение строки с несколькими символами другой строки

char *strncat(char *sl, char *s2, size_t n);

Функция добавляет не более n символов из s2 к s1 и возвращает s1. Первый символ s2 пишется на место завершающего нуль-символа строки s1. Если длина строки s2 меньше n, переписываются все символы s2. К строке s1 добавляется нуль-символ. Если строки перекрываются, поведение не определено.

Сравнение строки с несколькими символами другой строки

int strcmp(char *sl, char *s2, size_t n);

Сравнивает s1 и первые n символов s2 и возвращает отрицательное (если s1 меньше s2), нулевое (если s1 равно s2) или положительное (если s1 больше s2) значение.

Копирование нескольких символов одной строки в другую

char *strncpy(char *sl, char *s2, size_t n);

Копирует не более n символов из s2 в s1 и возвращает s1. Если длина исходной строки превышает или равна т, нуль-символ в конец строки s1 не добавляется. В противном случае строка дополняется нуль-символами до n-го символа. Если строки перекрываются, поведение не определено.

Поиск одного из символов строки в другой строке

char *strpbrk(char *sl, char *s2);

Возвращает указатель на символ, являющийся первым вхождением любого из символов из s2 в строку s1, если его нет, возвращается NULL.

Поиск символа в строке

char *strrchr(char *s, int ch);

Возвращает указатель на первое вхождение символа ch в строку s справа, если его нет, возвращает NULL.

Поиск символа строки, отсутствующего в другой

size_t strspn(char *sl, char *s2);

Возвращает индекс первого символа в s1, отсутствующего в s2.

Поиск подстроки в строке

shar *strstr(char *sl, char *s2);

Выполняет поиск первого вхождения подстроки s2 в строку s1. В случае удачного поиска, возвращает указатель на элемент из s1, с которого начинается s2, и NULL в противном случае.

Выделение лексем из строки

char *strtok(char *s1, char *s2);

Возвращает следующую лексему из s1, отделенную любым из символов из набора s2.

Преобразование строк на основе текущей локализации.

size_t strxfrm(char *s1, char *s2, size_t n);

Преобразует строку из s2 и помещает ее в s1 на основе текущей локализации. Преобразуется не более n символов.

Функции для работы с многобайтовыми символами

Для работы с многобайтными символами (типа wchar_t) предназначены функции: wsstrcat, wcscol1, wcscpy, wcscspn, wcslen, wcsncat, wcsncmp, wcsncpy, wcspbrk, wcsrchr, wcsspn, wcsstr, wcstok, wcstrxfrm, wmemcpy, wmemmove, wmemset. Данные функции аналогичны функциям для работы с символами типа char.

Например, функция сложения строк wsccat имеет формат, аналогичный формату функции strcat, и отличается только типом аргументов и возвращаемого значения:

wchar_t *wcscat(wchar_t *s1, wchar_t *s2);

Функция добавляет s2 к s1 и возвращает s1.

Пример: запрос пароля пароль не более трех раз.

#include <stdio.h>

#include <string.h>

int main( ){

char s[80], passw[] = "kuku";                // passw - эталонный пароль.

// Можно записать как *passw = "kuku";

int i, k = 0;

for (i = 0; !k && i<3; i++){

printf("\nВведите пароль;\n");

gets(s);                                                    

if (strstr(s,passw)) k = 1;                     //сравнение строк

}

if (k) printf("\nпapoль принят");

else printf("\nпapoль не принят");

return 0;

}

Распространенные ошибки при работе со строками — отсутствие нуль-символа и выход указателя при просмотре строки за ее пределы.

Пример: копирование строки src в строку dest.

Очевидный алгоритм решения задачи имеет вид:

char src[10], dest[10];

for (int i = 0; i<=strlen(src); i++) dest[i] = src[i];

Функция strlen вычисляет длину строки, выполняя поиск нуль-символа. Таким образом, строка фактически просматривается дважды. Более эффективным будет использовать проверку на нуль-символ непосредственно в программе.

Увеличение индекса можно заменить инкрементом указателей (для этого память под строку src должна выделяться динамически, а также требуется определить дополнительный указатель и инициализировать его адресом начала строки dest):

#include <iostream.h>

int main( ){

char *src = new char [10];

char *dest = new char [10], *d=dest;

cin >> src;

while ( *src!= 0) *d++ = *src++;

*d = 0;    // завершающий нуль

cout << dest;

return 0;

}

В цикле производится посимвольное присваивание элементов строк с одновременной инкрементацией указателей.

Результат операции присваивания — передаваемое значение, которое, проверяется в условии цикла, поэтому можно поставить присваивание на место условия, а проверку на неравенство нулю опустить (при этом завершающий нуль копируется в цикле, и отдельного оператора для его присваивания не требуется). В результате цикл копирования строки принимает вид:

while ( *d++ = *src++);

Оба способа работы со строками (через массивы или указатели) приемлемы и имеют свои плюсы и минусы, но в общем случае лучше, пользоваться функциями библиотеки или определенным в стандартной библиотеке C++ классом string.



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.