Читайте также:
|
|
Нахождение первого вхождения символа в блок памяти
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.
Дата добавления: 2015-07-21; просмотров: 51 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Ввод/вывод строк и символов | | | Функции стандартной библиотеки для преобразования строк в числа (заголовочный файл stdlib.h). |