Функции работы со строками из библиотеки обработки строк

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

1.Функция int strlen (const char* s); - определяет длину строки s. Возвращает количество символов, предшествующих завершающему нулевому символу. Обратите внимание, завершающий ноль-символ в длину не включается. Например,

cout << strlen("Hello!"); // на экране будет 6 char *str = "one";cout << strlen(str); // на экране будет 3

2.Функция char *strcpy(char *s1, const char *s2); - копирует строку s2 в массив символов s1. Возвращает значение s1. Массив символов s1 должен быть достаточно большим, чтобы хранить строку и ее завершающий нулевой символ, который также копируется. Например,

char str[25]; // объявляем символьный массив из 25 элементовchar *ps = new char [25]; /* объявляем указатель на символ и динамически выделяем память под 25 символов */ strcpy(str, "ABCDE"); // копируем в str строковыю константу "ABCDE"cout << str; // выводим str на экран. На экране будет ABCDE strcpy(ps, "QWERTY"); // копируем в ps строковыю константу "QWERTY"cout << ps; // выводим ps на экран. На экране будет QWERTY delete[] ps; // освобождаем память

Обратите внимание, если Вы хотите, чтобы одна строка содержала другую, Вы должны скопировать ее содержимое, а не присвоить! Так, например, в данном случае инструкция ps = "QWERTY" была бы ошибочна. Компилятор, встречая такую инструкцию, создают строку "QWERTY", за которой следует нулевой символ и присваивает значение начального адреса этой строки (адреса символа Q) переменной ps. Таким образом, теряется исходное значение ps, а значит невозможно корректно освободить память под ps.

3.Функция int *strcmp(const char *s1, const char *s2); - сравнивает строки s1 и s2 (по ASCII-кодам). Функция возвращает значение 0, если строки s1 и s2 равны, значение меньше ноля, если строка s1 меньше s2, и значение больше ноля, если s1 больше s2. Обратите внимание, строки сравниваются не по длине, а посимвольно, по ASCII-кодам ( т.е. "g" больше "ff"). Например,

cout << strcmp("compare", "string"); /* на экране будет -1, поскольку "compare" меньше "string" */ cout << strcmp("abcde", "abc"); //на экране будет 1, поскольку "abcde" больше "abc" cout << strcmp("one", "one"); /* на экране будет 0, поскольку строки равны */

4.Функция char *strcat(char *s1, const char *s2); - добавляет строку s2 к строке s1. Первый символ строки s2 записывается поверх ноль-символа строки s1. Возвращает s1. Под s1 должно быть выделено памяти не меньше чем (strlen(s1)+strlen(s2)+1). Например,

char st1[25] = "День";cout << strcat(st1, " добрый!"); // на экране будет День добрый!

5.Функция char *strncpy(char *s1, const char *s2, int n);- копирует не более n символов строки s2 в массив символов s1. Возвращает s1.

6.Функция char *strncmp(char *s1, const char *s2, int n); - сравнивает до n символов строки s1 со строкой s2. Возвращает 0, меньше, чем 0 или больше, чем 0, если s1 соответственно равно, меньше или больше s2.

7.Функция char *strncat(char *s1, const char *s2, int n); - присоединяет первые n символов строки s2 в строку s1. Возвращает s1.

8.Функция char *strchr(const char *s, int c); - проверяет строку s на содержание символа хранящегося в c. Результатом функции является адрес первого вхождения символа c в строку s. Если символ не найден, возвращается NULL. Например,

char str[20] = "ABCDEXYZ";cout << strchr(str, 'X'); // на экране будет XYZ

или

char str[20] = "ABCDEXYZ";if (strchr(str, 'q') == NULL) cout << "Нет такого символа!";

9.Функция char *strstr(const char *s1, const char *s2); - проверяет строку s1 на содержание подстроки s2. Результатом функции является адрес первого вхождения подстроки s2 в строку s1. Если подстрока не найдена, возвращается NULL. Например,

char str[20] = "ABCDEXYZ";char *ps = strstr(str, "DEX");if (ps != NULL) cout << ps; else cout << "Нет такой подстроки!";// На экране будет DEXYZ

10.Функция char *strlwr(char *s);- конвертирует строку к нижнему регистру (т.е. переводит строку в строчные символы). Например,

char str[30] = "ABCDE_123_ijk_XYZ";cout << strlwr(str); // на экране будет abcde_123_ijk_xyz

11.Функция char *strupr(char *s);- конвертирует строку к верхнему регистру (т.е. переводит строку в прописные символы).

12.Функция char *strset(char *s, int ch); - заменяет ВСЕ символы в строке s на символ ch. Например,

char str[30] = "ABCDE";cout << strset(str, 'x'); // на экране будет xxxxx

13.Функция char *strnset(char *s, int ch, int n); - заменяет первые n символов в строке s на символ ch.

14.Функция char *strrev(char *s); - меняет порядок следования символов в строке на противоположный (меняет первый символ с последним, второй символ с предпоследним и т.д.). Например,

char str[30] = "12345";cout << strrev(str); // на экране будет 54321

· Типичная ошибка программирования. Забывают включить заголовочный файл string.h при использовании функций из библиотеки обработки строк.

2.4 Работа со строками в С++. Примеры

Пример 1. Дана строка символов, подсчитать сколько раз среди символов строки встречается буква x.

Разбор задачи. Сначала необходимо запросить у пользователя строку, ввести ее с клавиатуры. Затем в цикле, начиная с первого символа, проверять равен ли текущий символ символу х, если да, символы равны, увеличить специальную переменную-счетчик на 1, иначе перейти к анализу следующего символа и так до конца строки. В конце вывести результат (значение переменной-счетчика) на экран. Замечание: не забудьте обнулить значение счетчика перед использованием.

#include “iostream”using namespace std;void main() { char str[100]; // объявление строки символов// просим пользователя ввести строку символов cout << "Vvedite stroky: "; cin >> str; // считываем строку, введенную пользователем int Kol = 0; /* объявление переменной-счетчика, в которой будем хранить количество вхождений х в строку */ // в цикле сравниваем каждый символ строки с х-ом, // в случае совпадения увеличиваем переменную-счетчик на 1. int i = 0; while(str[i] != '\0') { if (str[i] == 'x') Kol++; i++; } // выводим результат на экран cout << "Kolichestvo x ravno " << Kol;}

Пример 2. Написать программу, которая получает от пользователя набор символов, исключая пробел, и удаляет из этого набора все вхождения символов S и s.

Разбор задачи. Из условия задачи можно сделать следующие выводы: мы должны написать программу, которая при получении конкретного набора символов должна произвести проверку этого набора на наличие символов S и s. Если символ S (или s) встретится в наборе, то необходимо его удалить из этого набора. Конечный результат не должен содержать ни одного символа S и s.

Решение задачи будет состоять из трех блоков:

· получение данных от пользователя (т.е. пользователь должен ввести строку для обработки),

· анализ строки на наличие символов S и s,

· вывод результата.

Для нас наибольший интерес представляет этап анализа строки. Для реализации этого этапа нам нужно поэлементно двигаться от нулевого индекса массива к последнему и делать проверку каждого элемента. Если будет встречен такой элемент с индексом i, то нам нужно сместить все элементы с индексами большими чем i на один индекс меньше. Другими словами: пускай дана следующая строка:

A b s D e f0 1 2 3 4 5 ------ индексы

Проверяя поиндексно каждый элемент массива, находим, что 2 элемент массива и есть искомый символ. Тогда, нам нужно сместить каждый элемент массива на 1 индекс меньше, т.е. мы получим следующий результат:

A b D e f0 1 2 3 4

и тем самым добьемся решения задачи.

Реализация сказанного приведена ниже на С++.

#include “iostream”using namespace std;void main(){ const int n=10; //зададим размерность массива через константу char A[n]; //объявление символьного массива //Предупредим пользователя, что ввод ограничен размерностью массива cout << "Do enter any string but no more then "<< n-1 << "symbols"<<endl; cin >> A; // ввод строки int i=0; while(A[i]!='\0') //Цикл работает пока не встретится признак конца строки if (A[i]=='S'||A[i]=='s') //Проверка на искомый символ {/*Если это искомый символ, то перенесем оставшуюся часть строки на один элемент левее...*/ for (int j=i;A[j]!='\0';j++) A[j]=A[j+1]; } else i++; /*, а если это не искомый символ, то будем двигаться по нашему массиву дальше */ cout << endl << A << endl; // вывод результата */}

Замечание к задаче. Как Вы думаете, что произойдет, если в программу ввести строку содержащую пробелы (т.е. нарушить условия задачи)? Как Вы можете объяснить полученное?

Пример 4.Определить количество символов в своей Фамилии.

#include “iostream” #include <string.h> //Подключаем строковую библиотеку! using namespace std;   void main() { char s1[]="Иванов"; cout << strlen(s1); }

Пример 5.С помощью функции strcat добавить к своему имени отчество.

  #include "iostream" #include <string.h> using namespace std;   void main() { char s1[55]="Ekaterina"; char s2[55]="Alikseevna"; cout << strcat(s1, s2); }

Пример 6. Написать программу сравнения двух строк.

Разбор задачи. Чтобы понять, что означает одна строка "больше" или "меньше", чем другая строка, рассмотрим процесс расстановки имен по алфавиту. Вы, без сомнения, поставили бы "Jones" перед "Smith", потому что в алфавите J раньше S. Но как компьютер узнает о порядке следования букв?

Вспомним, что все символы представляются внутри компьютера как численные коды; когда компьютер сравнивает две строки, он на самом деле сравнивает численные коды символов в строке. (Замечание: коды символов упорядочены по алфавиту только для латинских букв, к кириллице это, к сожалению, не относится)



?>